SSO场景系列:实现Microsoft AD到阿里云的单点登录

【更新:随着RAM 2.0的上线,阿里云官网提供了对SAML Federation的官方技术文档,读者可以参考:https://help.aliyun.com/document_detail/96239.html ,同时推荐用户使用RAM控制台进行配置,原企业控制台(公测)将逐步下线】

在文章合规与安全:阿里云与企业身份系统的集成中,我们介绍了阿里云与企业身份系统的集成,可以配置云账号下的子账号通过企业身份系统登陆。配置要点是

  1. 在阿里云目录中配置可信企业SAML IdP
  2. 在企业IdP中配置阿里云为可信SAML SP

其中第二点在不同的身份系统中有不同的配置方法。本文以Windows Server 2012 R2为例,介绍如何配置Microsoft AD作为阿里云的单点登录IdP。

前置条件

本文假定用户对Microsoft AD做了合理正确的配置,在Windows Server 2012 R2上配置了以下Server Role

  • DNS服务器:DNS服务器用来将身份认证请求解析到正确的Federation Service上
  • Active Directory域服务 (AD DS):域服务提供对域用户和域设备等对象的创建,查询和修改等功能
  • Active Directory Federation Service (AD FS):Federation Service提供配置联合身份认证依赖方的功能,并对配置好的依赖方提供单点登录认证。

针对配置Active Directory的疑问,用户可以参考微软官方文档或者搜索相关的第三方博客。

示例配置

示例中用到相关配置如下

  1. 云账号的目录默认域名为junpu.onaliyun.com
  2. 云账号下包含子用户junpu.chen,其完整的User Principal Name(UPN)为junpu.chen@junpu.onaliyun.com
  3. 自建Microsoft AD中的AD FS服务名称是adserver.testdomain.com
  4. 自建Microsoft AD的域名为 testdomain.com,NETBIOS名为testdomain
  5. 用户junpu.chen在AD中的UPN为junpu.chen@testdomain.com,域内登陆也可以使用testdomain\junpu.chen

在阿里云目录中配置可信外部SAML IdP

在浏览器中输入如下地址

https://adserver.testdomain.com/FederationMetadata/2007-06/FederationMetadata.xml

将元数据XML文件下载存储到本地,并按照合规与安全:阿里云与企业身份系统的集成中介绍的流程,将下载好的IdP元数据文档配置到阿里云目录中。

完成这一步之后,阿里云目录则对示例中的AD FS产生了单向信任。如果用户在阿里云子用户登陆页面输入junpu.chen@junpu.onaliyun.com,阿里云则会向AD FS发出SAML认证请求,但是AD FS此时并不信任阿里云,因此AD FS会报出如下错误

SSO场景系列:实现Microsoft AD到阿里云的单点登录

在AD FS中配置阿里云为可信SP

在Microsoft的AD FS语境中,SAML SP被称作Relying Party(依赖方,信赖方),这是因为AD FS支持OAuth/OIDC/WS-Federation,而这三个协议中的单点登录消费方都被称作Relying Party,因此AD FS在对SAML协议支持中并没有采用SAML特有的术语Service Provider,而是统一采用Relying Party来指定不同协议中的单点登录消费方。

创建阿里云作为AD FS的可信SP步骤如下
第一步:在服务器管理器中的工具菜单中打开AD FS管理
SSO场景系列:实现Microsoft AD到阿里云的单点登录

第二步:在AD FS管理工具中添加信赖方信任(Relying Party Trust)

SSO场景系列:实现Microsoft AD到阿里云的单点登录

第三步:为新创建的信赖方设置阿里云的SAML元数据

信赖方可以直接配置元数据的URL,或者将阿里云SAML元数据下载之后,为信赖方配置下载好的XML文件。阿里云SAML元数据的URL可以通过以下方式获取:

  1. 登录 RAM 控制台。
  2. 单击人员管理 > 设置 > 高级设置,在SSO 登录设置下可以查看当前云账号的SAML 服务提供方元数据 URL。

完成配置信赖方之后,阿里云和AD FS就产生了互信,阿里云会将junpu.onaliyun.com目录内的用户认证请求转发到AD FS adserver.testdomain.com上,AD FS也会接受来自于阿里云的认证请求并向阿里云转发认证响应。

接下来需要对信赖方配置SAML断言中需要颁发的属性。

为阿里云SP配置SAML断言属性

为了让阿里云能使用SAML响应定位到云目录中的子用户,我们需要SAML断言中的NameID字段取值为云目录中子用户的UPN。

配置Active Directory中的UPN为SAML断言中的NameID

在这里,微软用了Claim(声明)这一术语来指代SAML断言中的属性。这是因为AD FS支持的其他协议(OAuth,WS-Fed等)也都使用Claim来表达Token中的字段。

第一步:为信赖方编辑声明规则
所谓声明规则,指的是Claims Rule,也就是SAML断言中的声明(属性)是怎样从Active Directory的用户属性中生成的。

SSO场景系列:实现Microsoft AD到阿里云的单点登录

第二步:添加颁发转换规则
所谓颁发转换规则,指的是Issuance Transformation Rule,指的是如何将一个已知的用户属性,经过转换之后,颁发为SAML断言中的属性。由于我们要将用户在AD中的UPN颁发为NameID,因此需要添加一个新的规则

SSO场景系列:实现Microsoft AD到阿里云的单点登录

规则的模版为转换传入声明

SSO场景系列:实现Microsoft AD到阿里云的单点登录

到这里,由于我们示例中的云账号里的UPN域名为junpu.onaliyun.com,而AD中的UPN域名为testdomain.com,显然如果直接将AD中的User Principal Name映射为NameID会让阿里云无法匹配到正确的子账号用户。

我们提供两个路径来填补这一空白。

路径一:在阿里云目录中验证AD域名

如果域名testdomain.com是一个在公网DNS中注册的域名,那么用户可以在阿里云目录中验证自己对域名的所有权。进入企业控制台的人员目录>域名设置>创建域别名

SSO场景系列:实现Microsoft AD到阿里云的单点登录

验证通过之后,阿里云目录的默认域junpu.onaliyun.com则有了一个域别名testdomain.com。子用户junpu.chen的UPN为junpu.chen@testdomain.com。

验证域名之后的云目录则可以在域名上与自建AD DS保持一致:云目录子用户的UPN与AD中用户的UPN都使用testdomain.com这个域名。

完成这个设置后,我们回到上面的声明转换规则编辑中,将UPN映射为NameID(名称ID)。

SSO场景系列:实现Microsoft AD到阿里云的单点登录

路径二:将AD中的User Principal Name的域名转换后颁发为NameID

如果域名testdomain.com是企业的内网域名,那么阿里云将无法验证企业对域名的所有权。云目录就只能采用onaliyun.com下的子域名。在这种情况下,在AD FS给阿里云颁发的SAML断言中就必须将UPN的域名后缀从testdomain.com替换为junpu.onaliyun.com(假定用户名一一对应)

SSO场景系列:实现Microsoft AD到阿里云的单点登录

最后

在笔者的示例中,自建ADtestdomain.com这一域名是内网域名,通过上述路径二对断言属性进行映射之后,从自建AD的内网访问阿里云,在子账号登陆中输入junpu.chen@junpu.onaliyun.com

SSO场景系列:实现Microsoft AD到阿里云的单点登录

阿里云将认证请求转发给adserver.testdomain.com

SSO场景系列:实现Microsoft AD到阿里云的单点登录

输入AD内的用户名junpu.chen@testdomain.com和密码之后,就完成了登陆回到阿里云控制台

SSO场景系列:实现Microsoft AD到阿里云的单点登录

常见问题

由于企业自建AD配置上可能有所不同,因此可能需要编辑略有不同的声明规则。但是最终的目标都是让SAML响应中能够返回阿里云目录可以识别的子账号UPN。

这里列出一些常见的问题

  • 如果没有配置声明规则,导致SAML断言中缺失NameID字段
无法解析外部身份提供商签发的认证信息。: Unable to understand SAML response
  • 如果SAML断言中的NameID域名与云目录并不一致
您的阿里云目录的外部单点登录配置无效,请联系管理员。: {"domainName":"testdomain.com"}
上一篇:java B2B2C Springboot电子商城系统- SSO单点登录之OAuth2.0 登出流程(3)


下一篇:JAVA—Spring—SpringCloud—一. 分布式系统