WCF的一种低安全验证机制

在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?

  1. private bool CheckAuthorization()
  2. {
  3. var ctx = WebOperationContext.Current;
  4. var auth = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];
  5. if (string.IsNullOrEmpty(auth) || auth != "fangxing/123")
  6. {
  7. ctx.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;
  8. return false;
  9. }
  10. return true;
  11. }

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;
} 然后在每一个服务契约的实现中,都去调用它。 [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 的错误:
客户端只要相应的验证信加到 RequestHeader 中去,就可以访问了。客户端可以使用单例模式设计 Client 对象。 这样就不用每次调用都去加验证信息了。

[c-sharp] view plaincopyprint?

  1. var url = "http://localhost:3433/TaskService/All";
  2. var client = new HttpClient();
  3. client.DefaultHeaders.Add("Authorization", "fangxing/123");
  4. 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?

  1. public class SecureWebServiceHostFactory : WebServiceHostFactory
  2. {
  3. protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
  4. {
  5. var host = base.CreateServiceHost(serviceType, baseAddresses);
  6. host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
  7. return host;
  8. }
  9. public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
  10. {
  11. var host = base.CreateServiceHost(constructorString, baseAddresses);
  12. host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
  13. return host;
  14. }
  15. }
  16. public class MyServiceAuthorizationManager : ServiceAuthorizationManager
  17. {
  18. protected override bool CheckAccessCore(OperationContext operationContext)
  19. {
  20. var ctx = WebOperationContext.Current;
  21. var auth = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];
  22. if (string.IsNullOrEmpty(auth) || auth != "fangxing/123")
  23. {
  24. ctx.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;
  25. return false;
  26. }
  27. return true;
  28. }
  29. }

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;
}
}
RegisterRoutes 里的工厂类也需要相应的修改下:

[c-sharp] view plaincopyprint?

  1. var securewebServiceHostFactory = new SecureWebServiceHostFactory();
  2. RouteTable.Routes.Add(new ServiceRoute("TaskService",
  3. 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.服务端将客户端令牌拿到发布令牌的服务上校验。

时间: 2024-08-09 13:07:53

WCF的一种低安全验证机制的相关文章

Oracle基础学习2--Oracle登录与三种验证机制

首先,Oracle安装完毕有三个默认用户 ?  Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 ?  System:数据库管理员,password为manager ?  Scott:一个普通用户,password为tiger 再看连接Oracle的三种验证机制 ?  操作系统验证(具体解释见以下) ?  password文件验证 ?  数据库验证 注:前两者适用于系统用户,比方:Sys.System等:最后一个适用于普通用户.比方:Scott. 再看Ora

Oracle数据库的三种验证机制

关于超级管理员登陆不需要密码因为: 数据库的三种验证机制: 操作系统验证(具有sysdba和sysopera的用户) 密码文件验证(具有sysdba和sysopera的用户) 数据库验证(普通用户) 因为不需要密码是不安全的,所以一般在计算机管理中的用户组ora_dba把Administrator删除,删除之后就要输入密码了. 启动监听:lsnrctl start 查看监听:lsnrctl status 停止监听:lsnrctl stop 1.oracle 数据服务器包括:实例进程和数据库:  

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例:

ASP.NET 身份验证机制

ASP.NET提供了3种认证方式:windows身份验证:IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问.Forms验证          :用Cookie来保存用户凭证,并将未经身份验证的用户重定向到自定义的登录页.Passport验证      :通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录和核心配置文件服务. 关于这三种验证方式的配置,推荐一篇博文:http://www.cnblogs.com/chenqingwei/arc

逆向工程第005篇:跨越CM4验证机制的鸿沟(上)

一.前言 <冠军足球经理>系列作为一款拟真度极高的足球经营类游戏,赢得过无数赞誉,而CM4可以说是这个传奇的起点.但是在游戏安装过程中,当用户输入完序列号之后,程序并不会对用户的输入进行真伪判断,只有等到安装完毕,进入游戏之后,通过游戏是否正常显示才能够得知.而如果遇到用户不小心输入错误的情况,那么只能卸载游戏重新安装,这就会造成很大的麻烦. 为解决这个问题,这次的研究会以两篇文章的篇幅通过两种方式对这个游戏进行逆向分析,一种是采用常见的"爆破"手段,也就是本文所讨论的方法

通过扩展改善ASP.NET MVC的验证机制[使用篇]

原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有很多的不足.在这篇文章中,我结合EntLib的VAB(Validation Application Block)的一些思想通过扩展为ASP.NET MVC提供一种更为完善的验证机制.[源代码从这里下载] 目录: 一.扩展旨在解决怎样的验证问题 二.一个简单的消息维护组件 三.多语言的支持 四.基于某

Oracle约束的状态及验证机制

一.Oracle约束的状态 Oracle完整性约束的状态有4种,分别是ENABLE.DISABLE.VALIDATE.NOVALIDATE. ENABLE          表示Oracle将检查要插入或更新的数据库中的数据是否符合约束: DISABLE         表示表中可以存放违反约束的行: VALIDATE       表示数据库验证表中的已存在数据是否符合约束: NOVALIDATE  表示数据库不验证表中已存在数据是否符合约束. Oracle默认约束状态为ENABLE.VALID

Linux用户安全及Linux PAM验证机制

一.Linux身份验证 1.用户与系统管理员     >用户分为系统管理员与普通管理用户两大类.            >每个用户在系统中都有唯一的用户名,是用户使用系统的凭证.     >系统管理员(System Manager) 又称之为超级用户,账号为"root",也叫根用户,拥有系统操作最高行使权.         >在系统中具有最高权限,主要负责系统管理工作.     >普通用户的账号可以随意取,通常的要求是不能以数字和下划线作为第一个字符.  

几种常用的认证机制

HTTP AUTH验证https://blog.csdn.net/baidu_35085676/article/details/78648311 HTTP Basic auth认证https://www.cnblogs.com/rinack/p/7595232.html 几种常用的认证机制https://blog.csdn.net/sundehui01/article/details/54799255?utm_source=blogxgwz5 Oauth2.0与Oauth1.0的区别 http: