WebAPI 2 的客户端身份验证

Client Authentication for WebAPI 2

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

这是一个非常"tricky" 的选项,用于对客户端进行身份验证和授权。它非常强大,但实施起来可能非常昂贵,因为您必须管理完整的 PKI(public 关键基础设施)并且您必须 安全地 分发证书致您的客户。

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 来获取客户端证书。如果没有客户端证书,方法 returns null。否则,它 returns 一个 X509Certificate2 实例。使用此对象从证书中获取信息,例如颁发者和主题。然后就可以使用这些信息进行认证and/or授权。

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

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

is this a solid approach?

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