2016-03-21 10 views
1

Моя компания написала API, чтобы предоставлять нашим приложениям данные нашим клиентам. Мы завершили конечные точки и теперь хотим защитить API. API будет использоваться только предварительно одобренными клиентами, поэтому анонимный доступ не требуется. Мне сказали, что мы можем использовать сертификат x.509, который мы генерируем, чтобы идентифицировать и аутентифицировать каждого клиента. Определив, я имею в виду внедрение клиентского кода в сертификат, который мы выдаем каждому клиенту (возможно ли это?). Как вы, вероятно, можете сказать, что у меня мало опыта в аутентификации клиентов с сертификатами, это прочный подход?Аутентификация клиента для WebAPI 2

ответ

2

Это очень «сложный» вариант для аутентификации и авторизации клиентов. Он очень мощный, но может быть очень дорогим для реализации, потому что вам нужно управлять полным PKI (инфраструктура открытого ключа), и вам необходимо бесплатно распределить сертификаты своим клиентам.

1) Вам нужно SSL на месте, и вы должны обеспечить его (даже в глобальном масштабе, если вы хотите):

public class RequireHttpsAttribute : AuthorizationFilterAttribute 
    { 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) 
      { 
       ReasonPhrase = "HTTPS Required" 
      }; 
     } 
     else 
     { 
      base.OnAuthorization(actionContext); 
     } 
    } 
} 

public class ValuesController : ApiController 
{ 
    [RequireHttps] 
    public HttpResponseMessage Get() { ... } 
} 

2) Вам необходимо настроить IIS, чтобы принимать клиентские сертификаты througt в application.host конфигурации или с помощью консоли диспетчера IIS:

<system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslNegotiateCert" /> 
     <!-- To require a client cert: --> 
     <!-- <access sslFlags="Ssl, SslRequireCert" /> --> 
    </security> 
</system.webServer> 

3) на стороне сервера, вы можете получить сертификат клиента, вызвав GetClientCertificate на сообщение запроса. Метод возвращает null, если сертификат клиента отсутствует. В противном случае он возвращает экземпляр X509Certificate2. Используйте этот объект для получения информации от сертификата, например, эмитента и субъекта. Затем вы можете использовать эту информацию для аутентификации и/или авторизации.

X509Certificate2 cert = Request.GetClientCertificate(); 
string issuer = cert.Issuer; 
string subject = cert.Subject; 

Проверить эту статью Майк Уотсон для полного reference (я дал вам выписку здесь).

Это прочный подход?

Да, но, как вы видели, как недостаток PKI иметь в виду. В конце концов вы можете реализовать OAuth2 auth, который также чрезвычайно эффективен, и вы можете легко основывать его на внешнем провайдере, например, для Azure AD. Проверьте this статью для более подробной информации. BTW, вы также можете начать с основного шаблона MVC/API.

+0

Спасибо Луке, эта ссылка на статью Майка Уотсона была именно тем, что мне нужно. Мы собираемся выдавать наши собственные сертификаты, потому что у нас ограниченная группа клиентов, которые будут использовать API, поэтому накладные расходы на отмену и выдачу новых клиентских сертификатов должны быть управляемыми. –

Смежные вопросы