WebAPI的客户端身份验证2

时间:2016-03-21 12:30:54

标签: security asp.net-web-api x509

我公司编写了一个API,向我们的客户公开我们的应用程序数据。我们已经完成了端点,现在想要保护API。 API仅供预先批准的客户使用,因此无需匿名访问。我被告知我们可以使用我们生成的x.509证书来识别和验证每个客户端。通过识别,我的意思是将客户端代码嵌入到我们向每个客户端颁发的证书中(这是否可能?)。您可能会告诉我在使用证书对客户端进行身份验证时几乎没有经验,这是一种可靠的方法吗?

1 个答案:

答案 0 :(得分: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配置为通过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;

查看Mike Watson的这篇文章是否完整reference(我在这里给你一个摘录)。

  

这是一个可靠的方法吗?

是的,但正如您所看到的那样,请记住PKI的缺点。最终,您可以实施OAuth2 auth,它也非常强大,您可以轻松地将其基于外部提供程序,以便用于解决Azure AD。查看this文章了解更多详情。顺便说一下,您也可以从基本的MVC / API模板开始。