在 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 管理器并执行以下步骤:

  1. 单击树视图中的站点节点。

  2. 双击中间窗格中的“SSL 设置”功能。

  3. 客户端证书下,选择以下选项之一:

    • 接受: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 将提示输入私钥的密码。

接下来,将证书添加到测试服务器的“受信任的根证书颁发机构”存储,如下所示:

  1. 打开 MMC。
  2. 在“文件”下,选择“添加/移除管理单元”。
  3. 在“可用管理单元”下,选择“证书”,然后单击“添加”
  4. 选择“计算机帐户”。
  5. 选择“本地计算机”并完成向导。
  6. 在导航窗格中,展开“受信任的根证书颁发机构”节点。
  7. 在“操作”菜单上,指向“所有任务”,然后单击“导入”,以启动证书导入向导。
  8. 浏览到证书文件 TempCA.cer。
  9. 单击“打开”,然后单击“下一步”并完成向导。 (系统将提示你重新输入密码。

现在,创建由第一个证书签名的客户端证书:

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;