关键词:系统集成,O2OA,SSO,单点认证,ADSF,AD域认证,SAML
O2OA平台提供灵活的系统集成方案,让企业信息平台与各类第三方系统进行集成。本篇主要介绍如何在O2OA中使用微软ADSF单点认证的方案与其他系统实现单点登入。
一、基本概念
1.1、 ADSF
Active Directory联合身份验证服务(AD FS,Active Directory Federation Services)是由微软自Windows Server 2003 R2起,在各个Server版本操作系统中提供的一个软件组件,其最新版本是集成在Windows Server 2019 的AD FS 2019(Azure AD)。
ADFS 使用基于Claims的访问控制验证模型来实现联合认证。它提供 Web 单一登录技术,这样只要在会话的有效期内,就可对一次性的对用户所访问的多个Web应用程序进行验证。
常见的联合身份验证的实现有SAML、OAuth、OpenID等方式,本文主要介绍的是基于Claims和SAML 2.0的 AD FS 联合身份验证。
1.2、 AD
AD的全称是Active Directory:活动目录,可以简单理解为LDAP。
1.3、 SAML
SAML (Security Assertion Markup Language),saml是一种xml格式的语言。 翻译过来大概叫 安全断言(标记)语言。 这里有两个点: 第一是“安全”, 第二是“断言(assertion)”。核心概念“断言”。 断言是什么? 就是做出判断的语言。比如一句话: 小明是超级管理员。 这就是一个断言。再来一个例子:小红没有权限读取根目录。这也是一个断言。SAML中大部分主要内容都是类似于:你是谁, 你有什么。。等等这些简单的语句。
二、基于SAML协议的ADSF单点登录集成
图来源: https://www.oasis-open.org/committees/download.php/11511/sstc-saml-tech-overview-2.0-draft-03.pdf
以上是用户认证的简单流程图,图中共有三个角色:
- Server Provider(SP):服务提供者,提供服务和资源
- Identity Provider(IDP):身份鉴别服务器,认证用户并生成saml断言,即ADFS服务器
- Client:用户访问服务的客户端,比如浏览器
三、ADSF单点接入
3.1、ADSF配置
首先在ADFS服务器,打开ADFS管理控制台,并定位到信任关系->信赖方信任,添加“添加信赖方信任”,参考:https://support.zendesk.com/hc/en-us/articles/203663886-Setting-up-single-sign-on-using-Active-Directory-with-ADFS-and-SAML-Professional-and-Enterprise-
注意点:
- 配置url步骤:配置信赖方SAML SSO服务url,url需为https的post协议,url为接入应用单点认证地址
- 配置加密方式为:sha1
- 传输数据不加密
- 添加转换声明规则:需要添加ad域映射属性
3.2、ADSF配置获取及登录测试
配置文件获取地址示例:https://xxx/federationmetadata/2007-06/federationmetadata.xml,此配置文件用户签名及签名校验
ADSF登录地址示例:https://xxx/adfs/ls/idpinitiatedsignon.htm,访问此地址页面可以看到上一步骤配置的信赖方,登录后可以直接单点到信赖方配置的sso地址。
3.3、开发单点服务接口
开发集成图第7步也即配置的ssourl接口,使用openSAML开发:
public HashMap> processResponse(String SAMLResponse) throws Exception {
//获取saml response xml对象
Response fetchedResponse = fetchResponse(SAMLResponse);
Assertion assertion = fetchedResponse.getAssertions().get(0);
Signature idpSignature = assertion.getSignature();
HashMap> claimsContainer = getFieldsFromAssertion(assertion);
if (idpSignature == null)
throw new RuntimeException("Cannot extract signature from the Identity Provider");
else {
//验签
verifyIDP(idpSignature, "/Users/Downloads/federationmetadata.xml");
}
return claimsContainer;
}
public Response fetchResponse(String SAMLResponse) throws Exception {
byte[] decodedB = Base64.decode(SAMLResponse);
System.out.println(new String(decodedB));
ByteArrayInputStream is = new ByteArrayInputStream(decodedB);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(is);
Element element = document.getDocumentElement();
Unmarshaller unmarshaller = Configuration.getUnmarshallerFactory().getUnmarshaller(element);
XMLObject xmlobj = unmarshaller.unmarshall(element);
Response respObject = (Response) xmlobj;
return respObject;
}