对 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 请求中指定基本身份验证
按如下所示指定使用基本身份验证:
- 字符串“Basic”将添加到
Authorization
请求的标头中。 - 用户名和密码组合成格式为“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 中的基本身份验证。
注意
基本身份验证不是为了管理注销而设计的。因此,用于注销的标准基本身份验证方法是结束会话。