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