在本文中,将探讨如何使用基本认证来保护基于REST的服务,特别是使用Microsoft Windows Communication Foundation (WCF) 实现的服务。基本认证是一种广泛使用的身份验证机制,它允许服务对客户端进行身份验证,以确保只有授权用户才能访问受保护的资源。然而,基本认证本身并不安全,因为用户名和密码是以Base64编码的形式发送的,这使得它们在传输过程中容易被截获和解码。为了增加安全性,建议使用HTTPS来加密传输通道。
基本认证是HTTP 1.0中定义的一种标准协议,它规定了客户端必须使用用户ID和密码进行身份验证。当客户端请求受保护的资源时,服务器会返回一个401 "未授权"的响应,并在响应头中添加WWW-Authenticate字段,指示使用基本认证。浏览器会根据这个响应生成一个对话框,提示用户输入用户名和密码。用户输入凭据后,客户端会重新发送请求,并在请求头中添加Authorization字段。服务器解码字符串,提取凭据,并与后端进行验证。如果凭据验证成功,服务器将向客户端返回请求的内容。
要将基本认证与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服务,请执行以下步骤:
虽然基本认证是一种保护网站或服务的方法,但认证机制本身并不安全。用户名和密码以Base64编码的形式通过互联网发送。为了增加安全性,服务器应该使用HTTPS提供服务。HTTPS可以确保Base64编码的用户名和密码无法被解密。
当想要向第三方提供服务并提供易于互操作的服务时,经常使用基本认证结合HTTPS。然而,如果控制了线路的两端,即客户端和服务器,WCF提供了一种标准安全机制,可以通过配置将其添加到服务中。