Може ли IIS да изисква SSL клиентски сертификати, без да ги свързва с потребител на Windows?

Искам да мога да картографирам SSL клиентски сертификати към потребители на ASP.NET Identity. Бих искал IIS да свърши възможно най-голяма част от работата (договаряне на клиентския сертификат и може би потвърждаване, че е подписан от доверен CA), но не искам IIS да картографира сертификата към потребител на Windows. Сертификатът на клиента се предава на ASP.NET, където се проверява и съпоставя към потребител с ASP.NET идентичност, който се превръща в ClaimsPrincipal.

Досега единственият начин, по който успях да накарам IIS да предаде сертификата на клиента към ASP.NET, е да активирам iisClientCertificateMappingAuthentication и да настроя съпоставяне много към едно към акаунт в Windows (който след това никога не се използва за нищо друго .) Има ли някакъв начин да накарате IIS да преговаря и да предаде сертификата без тази стъпка за конфигуриране?


person jlew    schedule 13.03.2015    source източник


Отговори (1)


Не е необходимо да използвате iisClientCertificateMappingAuthentication. Клиентският сертификат е достъпен в HttpContext.

var clientCert = HttpContext.Request.ClientCertificate;

Или активирайте RequireClientCertificate на целия сайт, или използвайте отделна страница за влизане с клиентски сертификат.

По-долу е даден начин да направите това в ASP.NET MVC. Надяваме се, че можете да използвате части от него, за да отговарят точно на вашата ситуация.

  1. Първо се уверете, че имате право да зададете SslFlags в web.config, като включите делегирането на функции.

IIS - Делегиране на функции

  1. Накарайте сайта да приема (но не изисква) клиентски сертификати въведете описание на изображението тук

  2. Задайте път към страницата за влизане с клиентски сертификат, където ще се изискват клиентски сертификати. В този случай потребителски контролер с действие CertificateSignin. web.config

  3. Създайте контролер за влизане (псевдокод)

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [AllowAnonymous()]
    public ActionResult CertificateSignIn()
    {
        //Get certificate
        var clientCert = HttpContext.Request.ClientCertificate;
    
        //Validate certificate
        if (!clientCert.IsPresent || !clientCert.IsValid)
        {
            ViewBag.LoginFailedMessage = "The client certificate was not present or did not pass validation";
            return View("Index");
        }
    
        //Call your "custom" ClientCertificate --> User mapping method.
        string userId;
        bool myCertificateMappingParsingResult = Helper.MyCertificateMapping(clientCert, out userId);
    
        if (!myCertificateMappingParsingResult)
        {
            ViewBag.LoginFailedMessage = "Your client certificate did not map correctly";
        }
        else
        {
            //Use custom Membersip provider. Password is not needed!
            if (Membership.ValidateUser(userId, null))
            {
                //Create authentication ticket
                FormsAuthentication.SetAuthCookie(userId, false);
                Response.Redirect("~/");
            }
            else
            {
                ViewBag.LoginFailedMessage = "Login failed!";
            }
        }
    
        return View("Index");
    }
    
person magnus    schedule 24.03.2015
comment
Да, сбърках относно причината да не получа сертификатите в HttpRequest. Започна да работи поради други промени, но това е добър отговор, благодаря за отделеното време. - person jlew; 24.03.2015
comment
Това изобщо не пита или подканва за клиентски сертификат!, Как клиентът предава сертификата на сървъра? - person Hiren Desai; 08.10.2015
comment
@HirenDesai - ...Това изобщо не изисква или подканва за клиентски сертификат... : Имайте предвид, че примерният ми код по-горе е за страната на сървъра, а не за страната на клиента. Ако вашият клиент е браузър, той трябва да ви подкани за сертификат, стига сертификат от един от предпочитаните издатели на сървъра да е наличен в CurrentUser CertificateStore\My. Ако вашият клиент е нещо друго, може да се наложи първо да изберете сертификата в код или конфигурация в зависимост от вашата рамка. ...Как клиентът предава сертификата на сървъра?... : Извършва се като част от ръкостискането на протокола. - person magnus; 09.10.2015
comment
@HirenDesai - Разкажете ми повече за вашата настройка (os/framework/клиент/сървър) и може да ви помогна. - person magnus; 09.10.2015
comment
@magnus - Да, бяхте прав, създадох същата настройка и вече работи. но проблемът е, че извежда грешки като: ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY и 403.16 при достъп от друг компютър. - person Hiren Desai; 10.10.2015
comment
@HirenDesai - 403.16 обикновено означава, че издателят на сертификата, който използвате на другия компютър, не е надежден. Поставете издателя на клиентския сертификат в хранилището на сертификати LocalMachine\Trusted Root Authorities на сървърите. Какъв тип клиент използвате? - person magnus; 11.10.2015
comment
ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY означава, че сертификатът не е наличен. @magnus е прав; но това не е проблем с доверието - просто е в грешния магазин. - person Fergus; 13.02.2016
comment
страхотно обяснение! Имам проблем, тясно свързан с това: В моя случай имам PKI удостоверяване, работещо перфектно с моите интранет потребителски сертификати (анонимен активиран и всичко останало деактивирано в IIS), но веднага щом добавя маркера за оторизация към web.config към предоставяне на достъп до определени потребителски групи, заявката се отказва с генеричния 401 - Неоторизиран: Достъпът е отказан поради невалидни идентификационни данни. съобщение. Някаква идея защо? Групата, до която разрешавам достъп, е правилна и потребителят принадлежи към нея - person Carlos; 13.10.2016
comment
@Carlos - картографирате ли ClientCertificate към потребител, използвайки iisClientCertificateMappingAuthentication, или сте въвели свое собствено решение, както в моя пример по-горе? - person magnus; 17.10.2016
comment
@magnus - Всъщност не, единственото нещо, което направих, е да активирам iisClientCertificateMappingAuthentication в IIS, нищо друго. Изпускам ли нещо? Това, което бих искал да направя, е да картографирам клиентския сертификат (много различни потребители, принадлежащи към конкретна AD група), за да разреша на приложението ASP.NET да проверява дали клиентският сертификат, изпратен от браузъра, принадлежи на валиден AD потребител в рамките на конкретна AD група . В IIS току-що активирах iisClientCertificateMappingAuthentication, но не посочих нищо за много към един, един към един и т.н. - person Carlos; 18.10.2016