二、为 ASP.NET Web API 启用 SSL

在本章中,我们将讨论使用 ASP 实现 SSL.NET Web API 和使用 SSL 客户端证书的用户认证。 基于普通 HTTP 的认证方案是不安全的。 例如,基本认证和表单认证发送纯文本,如用户名和密码。 因此,为了保护纯文本免受漏洞的侵害,我们使用 SSL,并使用 SSL 客户端证书对客户端进行认证。

在本章中,我们将涵盖以下主题:

  • 在 Web API 控制器中强制使用 SSL
  • 在 Web API 中使用客户机证书

在 Web API 控制器中强制 SSL

安全套接字层(SSL)加密保护客户端和服务器之间交换的凭据。 SSL 允许安全通道以加密格式传输认证消息。 128 位和 256 位 SSL 加密技术更加安全。 如果需要在客户端和服务器之间传输机密或个人数据,则需要使用 128 位或 256 位 SSL。 要解密使用 128 位或 256 位加密技术加密的内容是非常困难的。

SSL 和传输级别安全(TLS)使用公钥和对称密钥的组合加密。 SSL 握手是在服务器和客户机之间的初始通信期间交换消息的过程。 使用公钥技术允许服务器在握手过程中向客户机验证自己。

RSA 是一种密钥交换算法,它管理服务器和客户端在 SSL 握手期间确定要使用的对称密钥的方式。 SSL 加密套件使用 RSA 密钥交换,TLS 支持 ECC 加密套件和 RSA。

OpenSSH 基于 SSH 协议,它通过多种认证方法上的网络流量加密和提供安全隧道功能来帮助保护网络通信。 OpenSSH 是一种免费的开放源代码,可以用作未加密的网络通信协议(如 FTP 和 Rlogin)的替代品。

启用 SSL 允许客户端使用以HTTPS开头的 url 访问站点。 我们可以在 IIS 7 或更高版本中创建自签名证书; 它可以用于为站点启用 SSL 并添加 HTTPS 绑定。 为了开发目的,我们可以在 Visual Studio 中启用 IIS Express 中的 SSL,并在属性窗口中设置SSL EnabledTrue,如下截图所示:

Enforcing SSL in a Web API controller

在某些情况下,我们可能希望同时支持 HTTPS 和 HTTP 绑定。 我们可以对某些资源或操作启用 HTTP,对其他资源或操作启用 SSL。 在这种情况下,我们可以将带有RequireHttps过滤器属性的操作添加到所需的 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);
        }
    }
}

如下所示,您可以通过RequireHttps过滤器添加任何需要 SSL 的 Web API 动作:

public class ContactsController : ApiController
{
    [RequireHttps]
    public IEnumerable<Contact> GetAllContacts() { ... }
}

Enforcing SSL in a Web API controller

在 Web API 中使用客户端证书

为了以数字方式识别用户是否为经过认证的用户,需要使用客户端证书。 这是一种增强的安全机制,不像使用用户名和密码来保证安全性,因为这是一种简单的验证。 客户端证书允许 web 应用通过验证客户端在 HTTP 连接建立之前提供的证书来验证其用户。

创建 SSL 客户端证书

下面的步骤将创建一个用于开发和测试目的的测试根权威和客户端认证:

  1. 打开 Visual Studio 的开发人员命令提示符。
  2. 运行如下命令:

    makecert.exe -n "CN=Dev CA" -r -sv DevCA.pvk DevCA.cer

  3. 当提示makecert输入私钥时,输入证书密码。

上述步骤有助于创建根证书颁发机构证书。 现在,让我们使用Microsoft Management Control(MMC)将DevCA.cer证书安装到本地机器存储的受信任根证书颁发机构上,步骤如下:

  1. 打开微软管理控制。
  2. File菜单中点击添加/删除管理单元
  3. 可用管理单元列表中选择证书,然后点击添加按钮。
  4. 证书管理单元弹出窗口中选择计算机帐户管理证书,然后点击下一步按钮。
  5. 选择计算机窗口中选择本地计算机,然后点击完成按钮。
  6. 现在点击OK返回到 MMC。
  7. 控制台根树视图下,选择受信任的根证书颁发机构节点。
  8. 点击Actions窗格中的More Actions,并导航到All Tasks|Import导入证书。
  9. 浏览DevCA.cer证书文件,并单击Open按钮。
  10. 单击Next,完成向导。
  11. 提示时重新输入密码。
  12. 在 Visual Studio 的开发者命令提示符中执行以下命令来创建已签名的客户端证书:

    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 DevCA.cer -iv DevCA.pvk

配置 IIS 以接受客户端证书

下面的步骤将配置 IIS 以接受客户端证书:

  1. 在 IIS 管理器的树状视图中单击站点节点。
  2. 通过双击SSL 设置打开它。
  3. 客户端证书中选择以下任一选项:
    • Accept:IIS 将接受来自客户端的证书,但不需要
    • Require:IIS 需要一个客户端证书(要启用此选项,您还必须选择Require SSL)

现在,您知道了如何在 IIS Express 中进行配置以接受或要求客户端证书。 接下来,我们将看到如何在 Web API 中使用客户机证书。

在 Web API 中验证客户端证书

启用 HTTPS 并在 SSL 中使用客户端证书,并将签名证书分发给用户,将保护 Web API 并对客户端进行认证。

在请求消息上调用GetClientCertificate将客户端证书返回给 Web API。 如果没有客户端证书,该方法返回 null。 如果存在客户端证书,则返回X509Certificate2实例。 我们可以从实例对象X509Certificate2中获取关于发行者和主题的详细信息,并可用于认证和授权:

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

总结

我们刚刚看到了如何在 ASP 中使用 SSL.NET Web API,学习了如何使用 SSL 实现基本认证和表单认证。

您还了解了如何创建客户机证书并配置 IIS 以接受它们。

你必须知道如何在 Web API 中使用客户端证书。

在下一章中,让我们集成 ASP。 asp.net 身份识别系统。 净 Web API。 ASP.NET 身份识别系统将帮助您实现应用的社交登录。 它还允许您存储用户配置信息,如出生日期。 ASP.NET 标识在 asp.net 中可用.NET MVC、Web 表单和 Web API 模板。