[WCF权限控制]WCF的三种授权模式
前面的两篇文章(《从两个重要的概念谈起:Identity与Principal[上篇]》和《从两个重要的概念谈起:Identity与Principal[下篇]》)主要探讨基于安全主体的授权。通过这些介绍我们知道:如果我们在实施授权的时候,当前线程的安全主体能够被正确设置,我们就可以正确地完成授权。基于相同的原理,对于WCF的服务授权,如果正确的安全主体能够在服务操作被执行之前被正确设置到当前线程,借助于这个安全主体,我们不但可以采用命令式编程的方式将授权逻辑写在相应的操作中,也可以采用声明式编程的方式将授权策略定义在应用在服务操作方法上的PrincipalPermissionAttribute特性中。
目录: 一、三种授权模式 二、RoleProviderPrincipal 三、ServiceAuthorizationBehavior
一、三种授权模式
安全主体具有两个基本的要素:身份与权限。身份在客户端经过认证之后已经确立下来,现在需要解决的问题就是如何获取被认证用户的权限。为了解决这个问题,WCF为我们提供了不同的方案,我们把这些方案成为不同的“安全主体权限模式(Principal Permission Mode)”。具体来说,WCF支持如下三种安全主体权限模式。
- 采用Windows用户组:将经过认证的用户映射为同名的Windows帐号,将该帐号所在的用户组作为权限集;
- 采用ASP.NET Roles提供程序:通过ASP.NET角色管理机制借助于某个RoleProvider获取基于当前认证用户的角色列表,并将其作为权限集;
- 自定义权限模式:自定义权限解析和安全主体创建机制。
在WCF关于安全应用编程接口中,安全主体权限模式通过System.ServiceModel.Description.PrincipalPermissionMode枚举表示。下面的代码片断表示PrincipalPermissionMode的定义。
1: public enum PrincipalPermissionMode
2: {
3: None,
4: UseWindowsGroups,
5: UseAspNetRoles,
6: Custom
7: }
采用的安全主体权限模式决定了最终生成的安全主体的类型。之前我们介绍了WindowsPrincipal和GenericPrincoipal,而UseAspNetRoles模式对应的是另一种安全主体类型:RoleProviderPrincipal。
二、RoleProviderPrincipal
RoleProviderPrincipal定义在System.ServiceModel.Security命名空间下。RoleProviderPrincipal顾名思义,就是基于ASP.NET RoleProvider授权模式下产生的安全主体。和X509Identity一样,RoleProviderPrincipal仅仅是定义在System.ServiceModel程序集中的一个内部类型而已。下面的代码片断体现了RoleProviderPrincipal的定义。
1: internal sealed class RoleProviderPrincipal : IPrincipal
2: {
3: public RoleProviderPrincipal(object roleProvider, ServiceSecurityContext securityContext);
4: public bool IsInRole(string role);
5: public IIdentity Identity { get; }
6: }
三、ServiceAuthorizationBehavior
在运行时,WCF的服务端框架根据当前DispatchRuntime的PrincipalPermissionMode属性判断具体采用哪种安全主体权限模式。如果采用UseAspNetRoles模式,通过RoleProvider属性得到用于获取角色列表的RoleProvider。PrincipalPermissionMode和RoleProvider在DispatchRuntime中的定义如下所示。
1: public sealed class DispatchRuntime
2: {
3: //其他成员
4: public PrincipalPermissionMode PrincipalPermissionMode { get; set; }
5: public RoleProvider RoleProvider { get; set; }
6: }
而DispatchRuntime的上述两个属性最终是通过一个特殊的服务行为进行设置的,该服务行为的类型为ServiceAuthorizationBehavior。从下面的代码片断中可以看到PrincipalPermissionMode和RoleProvider两属性依然定义在ServiceAuthorizationBehavior中。定义在ServiceAuthorizationBehavior中的授权相关的设置最终通过ApplyDispatchBehavior方法被应用到所有终结点分发器(EndpointDispatcher)的DispatchRuntime上。
1: public sealed class ServiceAuthorizationBehavior : IServiceBehavior
2: {
3: //其他成员
4: void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters);
5: void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase);
6: void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase);
7:
8: public PrincipalPermissionMode PrincipalPermissionMode { get; set; }
9: public RoleProvider RoleProvider { get; set; }
10: }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- js实现HTML页面时钟动态显示
- WordPress标题的分隔符-被转义为–的解决办法
- WordPress网站实现下雪特效,云体验下雪的赶脚
- 小知识:后台执行Oracle创建索引免受会话中断影响
- Android:那些关于Fragment生命周期,你了解多少?
- 前端面试(题三)js
- .NET Core EFCore零基础快速入门简单使用
- vscode .vue文件 格式化配置
- 使用代码删除SAP CRM的附件(attachment)数据
- node版本管理器:nvm 和 n区别
- Apache - Hive环境部署与快速入门
- 编译和调试openjdk8
- linux编译openjdk8
- Elasticsearch从入门到放弃:瞎说Mapping
- PostgreSQL 为什么接受大量连接到数据库需要连接池