使用基本认证保护REST服务

在本文中,将探讨如何使用基本认证来保护基于REST的服务,特别是使用Microsoft Windows Communication Foundation (WCF) 实现的服务。基本认证是一种广泛使用的身份验证机制,它允许服务对客户端进行身份验证,以确保只有授权用户才能访问受保护的资源。然而,基本认证本身并不安全,因为用户名和密码是以Base64编码的形式发送的,这使得它们在传输过程中容易被截获和解码。为了增加安全性,建议使用HTTPS来加密传输通道。

基本认证简介

基本认证是HTTP 1.0中定义的一种标准协议,它规定了客户端必须使用用户ID和密码进行身份验证。当客户端请求受保护的资源时,服务器会返回一个401 "未授权"的响应,并在响应头中添加WWW-Authenticate字段,指示使用基本认证。浏览器会根据这个响应生成一个对话框,提示用户输入用户名和密码。用户输入凭据后,客户端会重新发送请求,并在请求头中添加Authorization字段。服务器解码字符串,提取凭据,并与后端进行验证。如果凭据验证成功,服务器将向客户端返回请求的内容。

扩展WCFREST以支持基本认证

要将基本认证与WCF REST集成,需要扩展WCF框架的功能。这个过程可以分为三个步骤:

  • 找到扩展点,以便对服务的所有操作应用行为
  • 基于现有标准创建自定义身份验证机制
  • 根据给定的凭据创建安全上下文

本文将详细描述这些步骤。

WCF REST是WCF REST Starter Kit的一部分。与标准WCF不同,WCF REST Starter Kit提供了一种简单的方法来对所有服务器操作应用行为。WCF REST使用请求拦截器(Request Interceptors),它们可以简化复杂的可扩展性点。请求拦截器在WCF通道级别执行,允许解释传入的请求并生成适当的响应。

public class MyRequestInterceptor : RequestInterceptor { public override void ProcessRequest(ref RequestContext requestContext) { // 访问requestContext.RequestMessage中的请求 } }

通过创建自定义的ServiceHostFactory,可以将RequestInterceptor链接到服务。ServiceHostFactory负责在托管环境中提供ServiceHost的实例。在IIS中托管的服务就是托管环境的一个例子。ServiceHostFactory的CreateServiceHost方法创建一个新的WebServiceHost,并将新的RequestInterceptor添加到Interceptors集合中。

public class BasicAuthenticationHostFactory : ServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { var serviceHost = new WebServiceHost2(serviceType, true, baseAddresses); serviceHost.Interceptors.Add(RequestInterceptorFactory.Create("DataWebService", new CustomMembershipProvider())); return serviceHost; } }

提供的源代码使用MembershipProvider来实际执行客户端凭据的身份验证。可以通过从MembershipProvider派生来编写自己的MembershipProvider。唯一需要实现的方法是ValidateUser方法,这是代码用来验证用户的方法。这个自定义的MembershipProvider在ServiceHostFactory的CreateServiceHost方法中链接到RequestInterceptor。

public class CustomMembershipProvider : MembershipProvider { public override bool ValidateUser(string username, string password) { // 执行验证 return false; } }

在验证了传入请求之后,需要创建并设置安全上下文。这使得可以在服务方法中使用客户端凭据。WCF使用线程本地的ServiceSecurityContext来实现这一点。在请求被验证之后,创建一个新的ServiceSecurityContext并将其添加到传入的请求中。

internal ServiceSecurityContext Create(Credentials credentials) { var authorizationPolicies = new List(); authorizationPolicies.Add(authorizationPolicyFactory.Create(credentials)); return new ServiceSecurityContext(authorizationPolicies.AsReadOnly()); }

使用代码

如果想使用提供的源代码使用基本认证来保护自己的WCFREST服务,请执行以下步骤:

  • 添加对BasicAuthenticationUsingWCF程序集的引用
  • 创建一个新的从MembershipProvider派生的Membership Provider
  • 实现ValidateUser方法,以针对后端安全存储进行验证
  • 创建一个自定义的BasicAuthenticationHostFactory,参见提供的源代码示例
  • 将新的BasicAuthenticationHostFactory添加到.svc文件的标记中

要点

虽然基本认证是一种保护网站或服务的方法,但认证机制本身并不安全。用户名和密码以Base64编码的形式通过互联网发送。为了增加安全性,服务器应该使用HTTPS提供服务。HTTPS可以确保Base64编码的用户名和密码无法被解密。

当想要向第三方提供服务并提供易于互操作的服务时,经常使用基本认证结合HTTPS。然而,如果控制了线路的两端,即客户端和服务器,WCF提供了一种标准安全机制,可以通过配置将其添加到服务中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485