Проверка подлинности сертификата rest api в Azure с помощью https

У меня проблемы с настройкой службы веб-API asp.net для аутентификации запросов по клиентским сертификатам

Я делаю шаги, описанные в Pro ASP.NET Web Api Security:

  1. Я создаю сертификаты, используя makecert.exe makecert.exe -r -n "CN=MobileTradeDataGateway" -pe -sv MobileTradeDataGateway.pvk -a sha256 -cy authority MobileTradeDataGateway.cer а также makecert.exe -iv MobileTradeDataGateway.pvk -ic MobileTradeDataGateway.cer -n "CN=DataGateway1" -pe -sv DataGateway1.pvk -a sha256 -sky exchange DataGateway1.cer -eku 1.3.6.1.5.5.7.3.2
  2. Я устанавливаю сертификат MobileTradeDataGateway в сервер доверенных корневых центров сертификации и в клиент тоже. Установите DataGateway1 в личном кабинете клиента.
  3. Настройте сайт для принятия сертификатов и включения. Включить анонимную аутентификацию.
  4. Создайте DelegatingHandler и добавьте его в коллекцию обработчиков сообщений в mvc для проверки сертификатов.
  5. Вызовите метод веб-API

    var certStore = new X509Store(StoreLocation.CurrentUser); certStore.Open(OpenFlags.ReadOnly); var collection = certStore.Certificates.Find(X509FindType.FindByIssuerName, "MobileTradeDataGateway", true); var cert = collection[0]; certStore.Close(); var messageHandler = new WebRequestHandler(); messageHandler.ClientCertificates.Add(серт); var client = new HttpClient(messageHandler) { BaseAddress = new Uri("...") }; var res = client.GetAsync("/api/orderuploader?number=5"). Результат;

,

Все отлично работает на моей локальной машине и в сети, где моя машина является сервером. Но когда я внедряю его в облачный сервис Azure, я получаю нольvar cert = request.GetClientCertificate(); // here is null в моем собственном обработчике делегирования

Конечно, я позволяю IIS принимать сертификаты и правильно помещать сертификаты в доверенные корневые центры сертификации.

Есть идеи?

3 ответа

Я думаю, что вы пропустили загрузку сертификата на портал Azure. Убедитесь, что вы загрузили сертификат.cer или.pfx на портал Azure. Дайте мне знать, если вам нужна помощь по загрузке и т. Д.

Вот код моего делегирующего обработчика из веб-интерфейса

public class X509ClientCertificateHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            WebApiEventSource.Log.InvalidHttpsScheme();
            return request.CreateResponse(HttpStatusCode.Forbidden);
        }
        var cert = request.GetClientCertificate(); // here is null!!!
        if (cert == null)
        {
            WebApiEventSource.Log.FailureAuthenticate("certificate is abcent", "", "");
            return request.CreateResponse(HttpStatusCode.Unauthorized);
        }
        var chain =new X509Chain {ChainPolicy = {RevocationMode = X509RevocationMode.NoCheck}};
        if (chain.Build(cert) && cert.Issuer.Equals("CN=MobileTradeDataGateway"))
        {
            var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, cert.Subject.Substring(3))
                };
            var principal = new ClaimsPrincipal(new[] {new ClaimsIdentity(claims, "X509")});
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
                HttpContext.Current.User = principal;
            WebApiEventSource.Log.SuccessAuthenticate(cert.SubjectName.Name);
            return await base.SendAsync(request, cancellationToken);
        }
        WebApiEventSource.Log.FailureAuthenticate("certificate is incorrect", cert.IssuerName.Name, cert.SubjectName.Name);
        return request.CreateResponse(HttpStatusCode.Unauthorized);
    }
}

Вы также пытались получить свой сертификат по "Thumbprint". Вот пример кода, который пытается прочитать сертификат из хранилища сертификатов.

private X509Certificate2 FindCertificate()
{
    X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    certificateStore.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certificates = certificateStore.Certificates;
    X509Certificate2Collection matchingCertificates = certificates.Find(X509FindType.FindByThumbprint, "CertThumbprint", false);
    if (matchingCertificates != null && matchingCertificates.Count > 0)
    {
        return matchingCertificates[0];
    }
    throw new ArgumentException("Unable to find a matching certificate in the certificate store. Please modify the search criteria.");
}

эта ссылка содержит больше информации о том, как вы можете прочитать сертификат из веб / рабочей роли

Другие вопросы по тегам