[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: }
- Python: matplotlib安装
- Java后端实现图片压缩技术(赞赏功能已开通,欢迎测试,噗~!)
- 我是如何得知10W+的访问量多来自工作日的 | 塔秘
- 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
- 【技术专栏】OpenVirteX体系结构之组件(一)
- 洞察 | 深圳数据分析师的职业前景如何?爬完拉勾数据给你分析 (附代码和过程)
- 【温故】金融数据挖掘之朴素贝叶斯
- 为你的网站加上SSL,可以使用HTTPS进行访问
- LeeCX - 开源后台管理系统简单介绍
- fastdfs 图片服务器 使用java端作为客户端上传图片
- Shiro系列(3) - What is shiro?
- 干货|用python抓取摩拜单车API数据并做可视化分析(源码)
- 干货|机器学习:Python实现聚类算法之K-Means
- 美团点餐—listview内部按钮点击事件
- 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 数组属性和方法
- Vue3对于一个前端来讲意味着什么?
- 这就是你日日夜夜想要的docker!!!---------Dockerfile构建nginx、Tomcat、MySQL镜像
- 深入揭秘前端路由本质,手写 mini-router
- 这就是你日日夜夜想要的docker!!!---------Docker四种网络模式解析
- C语言队列的基本操作
- 10款好用到爆的Vim插件,你知道几个?
- 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操
- 模式检验库Meteva笔记:加载本地观测数据
- Go by Example 中文版: SHA1 哈希
- C语言中缀表达式转后缀表达式
- C语言逆波兰表达式计算(后缀表达式计算器)
- SpringBoot+Druid+Mybatis配置多数据源
- C语言共享栈
- C语言二叉树的基本操作
- 《GEO数据挖掘课程》配套练习题