您的位置:首页 > 其它

WCF4.0 –- RESTful WCF Services (4) (Basic Security)

2013-07-19 17:20 477 查看
在REST架构的WCF服务中,它不像一般的WCF服务绑定,有配套的安全模式,实现起来那么简单。REST WCF服务只能在传输层加密,而一般的WCF 服务可以在消息层加密。因此 REST WCF服务启用ASP.NET兼容模式后,它的安全是由ASP.NET来保证的。本篇文章主要介绍在 REST WCF 中如何实现最简单的 Username 验证。

在SOAP协议的WCF中,可以通过SOAPHeader(MessageHeader)来实现用户名密码的传输,早在WebService时代我们就这么用过了。在REST WCF中,我们可以利用 HttpHeader 来完成这一目标。 (你可不会想在每个服务契约里加上用户和密码的参数吧...)

首先在服务中加入如下方法用于校验,Header的信息:如果 Header 中 Authorization 的字符串不是"fangxing/123" 那么就将返回 405 MethodNotAllowed 的错误。这个字符串的内容可以自定义,反正服务端根据某种规则检查这个字符串。

[c-sharp]
view plaincopyprint?

private bool CheckAuthorization()

{
var ctx = WebOperationContext.Current;
var auth = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];

if (string.IsNullOrEmpty(auth) || auth !=
"fangxing/123")
{
ctx.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;

return false;

}
return true;

}

[c-sharp]
view plaincopyprint?

var url = "http://localhost:3433/TaskService/All";

var client = new HttpClient();

client.DefaultHeaders.Add("Authorization",
"fangxing/123");
var resp = client.Get(url);

var url = "http://localhost:3433/TaskService/All";
var client = new HttpClient();
client.DefaultHeaders.Add("Authorization", "fangxing/123");
var resp = client.Get(url);


* 这里使用的是 Microsoft.Http.HttpClient (WCF REST Starter Kit) 而非 System.Net.WebClient

回头看服务端代码,每个服务实现中都需要加上 CheckAuthorization()
是不是很烦?

OK,我们知道这个 REST WCF服务是承载在一个Web Application上的, 通过往 RouteTable 中注册 WebServiceHostFactory 来激活服务对象的。 那么只要对这个 WebServiceHostFactory 做些“手脚”,就可以实现服务端验证的统一拦截,代码如下。(一般的 WCF 也可以利用此方法对 MessageHeader 进行拦截校验)

[c-sharp]
view plaincopyprint?

public class SecureWebServiceHostFactory : WebServiceHostFactory

{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)

{
var host = base.CreateServiceHost(serviceType, baseAddresses);

host.Authorization.ServiceAuthorizationManager =
new MyServiceAuthorizationManager();
return host;

}

public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)

{
var host = base.CreateServiceHost(constructorString, baseAddresses);

host.Authorization.ServiceAuthorizationManager =
new MyServiceAuthorizationManager();
return host;
}
}

public class MyServiceAuthorizationManager : ServiceAuthorizationManager

{
protected override
bool CheckAccessCore(OperationContext operationContext)

{
var ctx = WebOperationContext.Current;
var auth = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];

if (string.IsNullOrEmpty(auth) || auth !=
"fangxing/123")
{
ctx.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;

return
false;
}
return true;

}
}

[c-sharp]
view plaincopyprint?

var securewebServiceHostFactory = new SecureWebServiceHostFactory();

RouteTable.Routes.Add(new ServiceRoute("TaskService",

securewebServiceHostFactory, typeof(TaskService)));

var securewebServiceHostFactory = new SecureWebServiceHostFactory();
RouteTable.Routes.Add(new ServiceRoute("TaskService",
securewebServiceHostFactory, typeof(TaskService)));


这样服务端代码就可以去掉 CheckAuthorization()
而把验证工作都交给 SecureWebServiceHostFactory 了。

这种验证方式,其实也是现在 Windows Auzer Access Control 的原型。 只不过这个 Authoriztion 的服务是专门的Services罢了。

1. 客户端先从发布令牌的服务获取令牌; 2. 客户端拿着令牌提交到现在的服务; 3.服务端将客户端令牌拿到发布令牌的服务上校验。



源码下载:http://download.csdn.net/download/fangxinggood/3686322

【REST WCF系列】

RESTful WCF Services (1) (入门)

RESTful WCF Services (2) (实现增,删,改,查)

RESTful WCF Services (3) (Raw Stream)

RESTful WCF Services (4) (Basic Security)

RESTful WCF Services (实例) (并发同步服务 SyncService)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: