对 RESTful Web 服务进行身份验证

HTTP 支持使用多种身份验证机制来控制对资源的访问。 基本身份验证仅向具有正确凭据的客户端提供对资源的访问权限。 本文演示如何使用基本身份验证来保护对 RESTful Web 服务资源的访问。

注意

在 iOS 9 及更高版本中,应用传输安全 (ATS) 强制 Internet 资源 ((例如应用的后端服务器) 和应用)之间的安全连接,从而防止意外泄露敏感信息。 由于 ATS 默认在为 iOS 9 生成的应用中启用,因此所有连接都将受 ATS 安全要求的约束。 如果连接不符合这些要求,则会失败并出现异常。 如果无法对 Internet 资源使用协议和安全通信, HTTPS 则可以选择退出 ATS。 这可以通过更新应用的 Info.plist 文件来实现。 有关详细信息,请参阅 应用传输安全性

通过 HTTP 对用户进行身份验证

基本身份验证是 HTTP 支持的最简单身份验证机制,涉及客户端将用户名和密码作为未加密的 base64 编码文本发送。 此功能的工作原理如下:

  • 如果 Web 服务收到对受保护资源的请求,它会拒绝 HTTP 状态代码为 401 的请求, (访问被拒绝) 并设置WWW-Authenticate响应标头,如下图所示:

基本身份验证失败

  • 如果 Web 服务在正确设置标头的情况下 Authorization 收到对受保护资源的请求,则 Web 服务将响应 HTTP 状态代码 200,指示请求成功,并且请求的信息位于响应中。 下图显示了此方案:

基本身份验证成功

注意

应仅通过 HTTPS 连接使用基本身份验证。 通过 HTTP 连接使用时, Authorization 如果攻击者捕获了 HTTP 流量,则可以轻松解码标头。

在 Web 请求中指定基本身份验证

按如下所示指定使用基本身份验证:

  1. 字符串“Basic”将添加到 Authorization 请求的标头中。
  2. 用户名和密码组合成格式为“username:password”的字符串,然后对 base64 进行编码并添加到 Authorization 请求的标头中。

因此,使用用户名“XamarinUser”和密码“XamarinPassword”时,标头变为:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

HttpClient可以在 属性上HttpClient.DefaultRequestHeaders.Authorization设置Authorization标头值。 HttpClient由于 实例存在于多个请求中,因此只需设置标头Authorization一次,而无需在发出每个请求时设置,如以下代码示例所示:

public class RestService : IRestService
{
  HttpClient _client;
  ...

  public RestService ()
  {
    var authData = string.Format ("{0}:{1}", Constants.Username, Constants.Password);
    var authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));

    _client = new HttpClient ();
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Basic", authHeaderValue);
  }
  ...
}

然后,向 Web 服务操作发出请求时,该请求使用 Authorization 标头进行签名,指示用户是否有权调用该操作。

重要

虽然此代码将凭据存储为常量,但它们不应以不安全的格式存储在已发布的应用程序中。

处理授权标头服务器端

REST 服务应使用 [BasicAuthentication] 属性修饰每个操作。 此属性用于分析标头, Authorization 并通过比较 base64 编码凭据与 存储在Web.config中的值来确定它们是否有效。虽然此方法适用于示例服务,但需要扩展面向公众的 Web 服务。

在 IIS 使用的基本身份验证模块中,用户将根据其 Windows 凭据进行身份验证。 因此,用户必须在服务器的域中拥有帐户。 但是,基本身份验证模型可以配置为允许自定义身份验证,其中用户帐户针对外部源(如数据库)进行身份验证。 有关详细信息,请参阅 ASP.NET 网站上的 ASP.NET Web API 中的基本身份验证

注意

基本身份验证不是为了管理注销而设计的。因此,用于注销的标准基本身份验证方法是结束会话。