在 Web API 中使用 SSL
一些常见的身份验证方案在纯 HTTP 上不安全。 具体而言,基本身份验证和表单身份验证发送未加密的凭据。 若要安全,这些身份验证方案必须 使用 SSL。 此外,SSL 客户端证书可用于对客户端进行身份验证。
在服务器上启用 SSL
在 IIS 7 或更高版本中设置 SSL:
- 创建或获取证书。 若要进行测试,可以创建自签名证书。
- 添加 HTTPS 绑定。
有关详细信息,请参阅 如何在 IIS 7上设置 SSL。
对于本地测试,可以从 Visual Studio 在 IIS Express 中启用 SSL。 在“属性”窗口中,将“已启用 SSL”设置为“True”。 请注意 SSL URL; 的值;使用此 URL 测试 HTTPS 连接。
在属性 中启用了 S S L 的
在 Web API 控制器中强制实施 SSL
如果同时具有 HTTPS 和 HTTP 绑定,客户端仍可使用 HTTP 访问站点。 你可能允许某些资源通过 HTTP 提供,而其他资源需要 SSL。 在这种情况下,请使用操作筛选器来要求为受保护资源使用 SSL。 以下代码显示了用于检查 SSL 的 Web API 身份验证筛选器:
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);
}
}
}
将此筛选器添加到任何需要 SSL 的 Web API 操作:
public class ValuesController : ApiController
{
[RequireHttps]
public HttpResponseMessage Get() { ... }
}
SSL 客户端证书
SSL 使用公钥基础结构证书提供身份验证。 服务器必须提供向客户端验证服务器的证书。 客户端向服务器提供证书不太常见,但这是对客户端进行身份验证的一个选项。 若要将客户端证书与 SSL 配合使用,需要一种方法将签名的证书分发给用户。 对于许多应用程序类型,这不会是一个很好的用户体验,但在某些环境中(例如企业)可能可行。
优势 | 缺点 |
---|---|
- 证书凭据比用户名/密码强。 - SSL 提供完整的安全通道,其中包含身份验证、消息完整性和消息加密。 | - 必须获取和管理 PKI 证书。 - 客户端平台必须支持 SSL 客户端证书。 |
若要将 IIS 配置为接受客户端证书,请打开 IIS 管理器并执行以下步骤:
单击树视图中的站点节点。
双击中间窗格中的“SSL 设置”功能。
在 客户端证书下,选择以下选项之一:
- 接受:IIS 将接受来自客户端的证书,但不需要证书。
- 需要:需要客户端证书。 (若要启用此选项,还必须选择“需要 SSL” )
还可以在 ApplicationHost.config 文件中设置这些选项:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<!-- To require a client cert: -->
<!-- <access sslFlags="Ssl, SslRequireCert" /> -->
</security>
</system.webServer>
SslNegotiateCert 标志意味着 IIS 将接受来自客户端的证书,但不需要一个证书(等效于 IIS 管理器中的“接受”选项)。 若要要求证书,请设置 SslRequireCert 标志。 若要进行测试,还可以在本地 applicationhost 中的 IIS Express 中设置这些选项。配置文件,位于“Documents\IISExpress\config”。
创建用于测试的客户端证书
出于测试目的,可以使用 MakeCert.exe 创建客户端证书。 首先,创建测试根证书颁发机构:
makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer
Makecert 将提示输入私钥的密码。
接下来,将证书添加到测试服务器的“受信任的根证书颁发机构”存储,如下所示:
- 打开 MMC。
- 在“文件”下,选择“添加/移除管理单元”。
- 在“可用管理单元”下,选择“证书”,然后单击“添加”。
- 选择“计算机帐户”。
- 选择“本地计算机”并完成向导。
- 在导航窗格中,展开“受信任的根证书颁发机构”节点。
- 在“操作”菜单上,指向“所有任务”,然后单击“导入”,以启动证书导入向导。
- 浏览到证书文件 TempCA.cer。
- 单击“打开”,然后单击“下一步”并完成向导。 (系统将提示你重新输入密码。
现在,创建由第一个证书签名的客户端证书:
makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name"
-eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk
在 Web API 中使用客户端证书
在服务器端,可以通过在请求消息上调用 GetClientCertificate 来获取客户端证书。 如果没有客户端证书,该方法将返回 null。 否则,它将返回 X509Certificate2 实例。 使用此对象从证书获取信息,例如颁发者和使用者。 然后,可以使用此信息进行身份验证和/或授权。
X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;