在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 的错误。这个字符串的内容可以自定义,反正服务端根据某种规则检查这个字符串。
然后在每一个服务契约的实现中,都去调用它。
[WebGet(UriTemplate = "All")]
public List<Task> GetTask()
{
if (!CheckAuthorization())
return null;
return GetData();
}
[WebGet(UriTemplate = "{taskId}")]
public Task GetTaskById(string taskId)
{
if (!CheckAuthorization())
return null;
return GetData().FirstOrDefault(t => t.Id==taskId);
}
现在的服务,如果直接通过浏览器访问,将得到 405 MethodNotAllowed 的错误:
![](http://hi.csdn.net/attachment/201103/20/0_1300638091x9Tm.gif)
客户端只要相应的验证信加到 RequestHeader 中去,就可以访问了。客户端可以使用单例模式设计 Client 对象。
这样就不用每次调用都去加验证信息了。
* 这里使用的是 Microsoft.Http.HttpClient (WCF REST Starter Kit) 而非 System.Net.WebClient
回头看服务端代码,每个服务实现中都需要加上 CheckAuthorization() 是不是很烦?
OK,我们知道这个 REST WCF服务是承载在一个Web Application上的, 通过往 RouteTable 中注册 WebServiceHostFactory 来激活服务对象的。 那么只要对这个 WebServiceHostFactory 做些“手脚”,就可以实现服务端验证的统一拦截,代码如下。(一般的 WCF 也可以利用此方法对 MessageHeader 进行拦截校验)
RegisterRoutes 里的工厂类也需要相应的修改下:
这样服务端代码就可以去掉 CheckAuthorization() 而把验证工作都交给 SecureWebServiceHostFactory 了。
这种验证方式,其实也是现在 Windows Auzer Access Control 的原型。 只不过这个 Authoriztion 的服务是专门的Services罢了。
1. 客户端先从发布令牌的服务获取令牌; 2. 客户端拿着令牌提交到现在的服务; 3.服务端将客户端令牌拿到发布令牌的服务上校验。
![](http://hi.csdn.net/attachment/201103/20/0_1300639333KJ4F.gif)
源码下载: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)
分享到:
相关推荐
(英文版)WCF 4.0 Multi-tier Services Development with LINQ to Entities Packt Publishing 出版2010, PDF格式
WCF 4.0 Multi-tier Services Development.with LINQ to Entities
WCF很好的支持了REST的开发,而RESTful的服务通常是架构层面上的考虑。因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持HTTP请求,无需去实现复杂的客户端代理,无需使用复杂的数据...
wcf4.0英文教材wcf4.0英文教材wcf4.0英文教材
WCF很好的支持了REST的开发,而RESTful的服务通常是架构层面上的考虑。因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持HTTP请求,无需去实现复杂的客户端代理,无需使用复杂的数据...
在REST架构的WCF服务中,它不像一般的WCF服务绑定,有配套的安全模式,实现起来那么简单。RESTWCF服务只能在传输层加密,而一般的WCF服务可以在消息层加密。因此RESTWCF服务启用ASP.NET兼容模式后,它的安全是由ASP...
WCF4.0 –- RESTful WCF Services (3) (Raw Stream) 对REST WCF的原生(RAW)流传输进行一次实例分析。 http://blog.csdn.net/fangxinggood/article/details/6261431
WCF4.0 -- RESTful WCF Services 错误处理 (Error Handling) http://blog.csdn.net/fangxinggood/article/details/6324642
Finally, you will get to grips with the RESTful WCF services and security. Table of Contents Chapter 1. Implementing a Basic HelloWorld WCF Service Chapter 2. Hosting the HelloWorld WCF Service ...
WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--
Packtpub WCF 4.0 Multi tier Services Development with LINQ to Entities Jun.2010 关于WCF 4.0 和LINQ to Entity 的 新书 流行加时尚的编程利器
WCF 4.5 Multi-Layer Services WCF C# .net webservice soap
WCF 4.5 Multi-Layer Services Development with Entity Framework(3rd) 英文无水印pdf 第3版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
[Packt Publishing] WCF 4.0 Multi-tier Services Development with LINQ to Entities ============================================================ [Packt Publishing] WCF 4.5 多层服务开发 —— 使用 Entity ...
WCF代码1-简单的WCF程序WCF代码1-简单的WCF程序