上一篇我们最终把 ADFS 与应用之间的信任关系建立起来了,但是应用接收到的声明信息只有默认的两个,这次我们就来学学怎么配置声明。

一.声明存储配置

  1. ADFS 目前默认支持三种方式的声明值存储,另外还有自定义存储,不过我没去研究

二.编辑预定义声明

三.编写自己的定制声明

如果你需要编写自定义的声明规则,那么你需要掌握一种描述声明的语法,很简单的,首先让我们看看上边配置的电子邮件声明生成的语句

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=>
issue(store = "Active Directory", type = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"),
query = ";mail;{0}", param = c.Value);

可以看到符号 “=>”将声明语句分隔成两部分,第一句的 “c:[Type == ….]”是条件,第二句的 “issue(store=…)”是发布,意思是说只有当条件为真才会发布该声明,如果条件不填写,默认为真,直接发布声明,比如我们可以发布一个公司名称的声明如下

=> issue(type = ("http://test.com/company"),value = "CHK");

语句可以使用多个条件,,中间使用 && 连接,比如以下声明要求手机号为 “123”和电子邮件为“a@a.com”才发布角色声明

c1:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/phonenumber", Issuer == "AD AUTHORITY", Value == ""]
&&
c2:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/emailaddress", Issuer == "AD AUTHORITY", Value == "a@a.com"]
=> issue(type = ("http://test.com/role"), value = "Unknow");

还可以变更声明的存储位置,使用特殊的查询语句,比如使用 SQL 存储声明的话,可以写出如下语句

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/accountname", Issuer == "AD AUTHORITY"]
=>
issue(store = "{SQL存储的名称,在自定义声明存储配置}", type = "http://test.com/phonenumber",
query = "Select phonenumber from UserDetail where userName = {0}", param = c.Value)

多个参数使用逗号隔开, “c.Value”其实取的就是条件语句中 “c”这个声明对象也即用户的账户名

另外这种声明语言还支持简单的几个函数,比如值以某个字符串开头,以某个字符串结尾等,这里就不详细赘述了。

我们另外看看一个比较有趣的关键字 add.

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/accountname", Issuer == "AD AUTHORITY", Value == "Administrator"]
=>
add(type = "http://test.com/role", value= "管理员")
c1:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/accountname", Issuer == "AD AUTHORITY", Value == "Administrator"]
&&
c2:[Type == "http://test.com/role"]
=>
issue(Claim = c2)

第一段声明使得用户名为 Administrator 的用户可以获得管理员角色的声明,类似的用法还可以用在标识用户的地区,比如北京就增加一个首都之类的声明,也是挺方便的。

最后再说两个比较常用的关键字 EXISTS 和 Not EXISTS,其实用法跟 SQL 语句一样啦

EXISTS([type == "http://test.com/emailaddress"])
=> issue(type = http://test.com/role, value = "Email User");
NOT EXISTS([type == "http://test.com/location"])
=> add(type = "http://test.com/location", value = "Unknown");

还有一些我没讲到的语法细节,有兴趣的可以去这篇博客看看,注意是英文的,当然我都能看懂您就别担心了。

ADFS 的基本配置大概就到这了,下次有机会讲讲多个公司间 ADFS 服务的配置,还有 ADFS 的代理以便员工外网访问,最好能把 ACS(社交服务账户如 Facebooke、GoogleAccount 之类与 ADFS 的集成) 也讲一下。

如果您等不及我的博客,这里推荐一本 PDF 指导书籍,写得相当好,我大部分 ADFS 知识都是从上边看来的。

ADFS 2.0 配置简介 PartⅢ – 声明规则语言的更多相关文章

  1. ADFS 2.0 配置简介 PartⅡ – 配置 ADFS 信任关系

    ADFS 与应用程序间的各种验证是基于信任关系的,在 ADFS 服务器配置好要信赖的应用程序(以 URL 为标识)后,应用程序再通过指定认证服务器来将用户引导至 ADFS 登录页,登录完成后再将用户的 ...

  2. ADFS 2.0 配置简介 PartⅠ – 安装ADFS

        Active Directory Federation Service 也即联盟身份认证服务是微软的单点登录解决方案 (SSO),配置步骤相当多,中文资料也比较少,写在这里希望对后来人有所帮助 ...

  3. SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter实战

    补充:SpringBoot启动日志 1.深入SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter实战(核心知识) 简介:讲解SpringBoot里面Filter ...

  4. TP 5.0 架构 简介

    TP 5.0 架构 简介 thinkphp 5.0 为API开发而设计的的高性能框架,是与以往thinkphp5.0以下版本大不相同的新型框架,病对以颠覆和重构版本,采用全新的架构思想,引入了更多的P ...

  5. Configuration所有配置简介

    // 内存缓存的设置选项 (最大图片宽度,最大图片高度) 默认当前屏幕分辨率                // .memoryCacheExtraOptions(480, 800) // 硬盘缓存的 ...

  6. Hadoop-2.0 目录简介

    Hadoop-2.0 目录简介 一.目录结构 将下载的压缩包解压: 解压后文件夹如下: 二.各文件夹目录结构 1.bin:Hadoop2.0的最基本管理脚本和使用脚本所在目录.这些脚本是sbin目录下 ...

  7. Django中的路由配置简介

    Django中的路由配置简介 路由配置(URLconf)就是Django所支撑网站的目录.其实,我们利用路由交换中的"寻址"的概念去理解Django的路由控制会简单很多,它的本质就 ...

  8. WebService之Axis2(1):用POJO实现0配置的WebService

    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持S ...

  9. OpenID Connect Core 1.0(九)声明(Claims)

    5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...

随机推荐

  1. ThreadLocal的内存泄露(转)

    ThreadLocal的目的就是为每一个使用ThreadLocal的线程都提供一个值,让该值和使用它的线程绑定,当然每一个线程都可以独立地改变它绑定的值.如果需要隔离多个线程之间的共享冲突,可以使用T ...

  2. Android项目打包成APK文件

    第一步:右键单击该项目选择Export项目 显演示样例如以下界面:选择Exprot Android Application 第二步:输入项目名称,默认的情况下是原始的项目名称 下一步: 点击 Crea ...

  3. android控制控制的显示顺序

    在android中假设首先在xml中静态加入了一个控件,剩下的控件都是通过addView动态加入.那么假设有控件覆盖的情况(比方说使用FrameLayout或者RelativeLayout),先加入得 ...

  4. MySQL学习系列2--MySQL执行计划分析EXPLAIN

    原文:MySQL学习系列2--MySQL执行计划分析EXPLAIN 1.Explain语法 EXPLAIN SELECT …… 变体:   EXPLAIN EXTENDED SELECT …… 将执行 ...

  5. Python challenge 3 - urllib & re

    第三个主题地址:http://www.pythonchallenge.com/pc/def/ocr.html Hint1:recognize the characters. maybe they ar ...

  6. NYOJ 105 其余9个

    九的余数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 如今给你一个自然数n,它的位数小于等于一百万,如今你要做的就是求出这个数整除九之后的余数. 输入 第一行有一 ...

  7. Configuration配置信息管理

    Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...

  8. [Java] 一、对象的创建 & 销毁

    *1.考虑静态工厂方法(static factory method)代替构造器?!优势?不足? 服务提供者架构: 1.服务接口(Service Interface) -- 提供者实现的: 2.提供者注 ...

  9. SharePoint 创建一个简单的Web Part 部分

    SharePoint 创建一个简单的Web Part 部分 标准Web零件有时会很强大,运行多个功能的能力. 本文介绍了如何使用Visual Studio 创建一个简单的Web部分. 1. 打开VS, ...

  10. jQuery组织您钞四----jQuery操作DOM

    一.采用jQuery创建节点 节点是DOM基础设施.依据DOM产品规格,Node是一个很宽泛的概念,包含元素.属性.正文.档..实际开发过程中,要创建动态内容,主要操作的节点包括元素. 属性和文本. ...