基于SAML的SharePoint第三方身份认证系统接入设计
2013-04-29邓云飞
邓云飞
摘 要 Microsoft SharePoint Server 2010拥有独立的认证、授权管理模块,并严格遵循了SAML、WS-Trust、WS-Federation等相关的工业标准。而通过Windows Identity Foundation可以将 WS-Trust、WS-Federation等协议抽象化,向开发人员呈现用于构建安全令牌服务和声明感知应用程序的API,以SAML形式使得非工业标准的认证系统为Microsoft SharePoint Server 2010提供身份认证服务成为了可能。本文设计过程中基于SAML,讨论了非工业标准化的第三方身份认证系统接入Microsoft SharePoint Server 2010实现原理、构建和关键的方法。
关键词 Windows Identity Foundation Microsoft SharePoint Server 2010 SAML 安全令牌服务
中图分类号:TP319 文献标识码:A
1 概述
作为一个成熟的企业级业务解决方案,Microsoft SharePoint Server 2010以灵活的部署选项和丰富的管理工具,使得用户无需编写代码就可以快速、便捷地设计任务表单和业务流程,帮助企业用户拓展在内容管理、内外部协同和企业业务流程管理能力,并将SharePoint平台和企业其他业务系统集成,使得端到端的合作更为容易,实现了个人、团队的信息整合、组织和搜索功能。其提供直观的审批流程定义和强大的流程逻辑定义功能,结合企业组织结构信息,定义复杂的审批、审阅流程。利用Sharepoint可以将企业的日常业务流程如人事入职、出差申请、休假申请、加班申请、费用报销、项目立项、固定资产采购、公章使用等集中到SharePoint平台统一部署和管理。而在实际应用环境下,企业中存在大量的业务系统集,并使用统一身份认证系统作为单点登录的支持,Microsoft SharePoint Server 2010虽然也提供了身份认证功能,但本身是遵循SAML、WS-Trust等相关工业标准的,而企业自身的认证系统并不一定是符合行业标准,这样导致企业自身的身份认证系统信息不能被SharePoint所识别,使得不同系统间身份信息转换变得异常复杂,这样就存在如何将现有的认证系统与SharePoint Server 2010进行整合以实现真正意义上的单点登录的问题。
2 SharePoint的身份验证机制剖析
2.1 身份验证步骤
在SharePoint Server 2010系统的身份验证过程中,是按照图1标示的步骤进行的:
(1)客户端请求SharePoint Server 2010系统相关页面资源;
(2)SharePoint检查客户端请求的身份认证信息,若请求未通过身份验证,则身份验证组件将根据该区域的身份验证设置传送请求;
(3)验证请求交由身份验证组件处理。如果为给定区域配置了多个身份验证方法,则用户可通过身份验证选择页选择身份验证方法。如果仅指定了一种身份验证方法,将直接通过指定的身份验证方法处理请求;
(4)通过身份提供程序对用户进行身份验证;
(5)如果身份验证成功,SharePoint 安全令牌服务(STS)将使用身份提供程序提供的信息为用户生成基于声明的令牌。如果配置了其他声明提供程序,则STS会使用声明提供程序提供的声明来扩充用户令牌;
(6)将基于声明的用户令牌发送回身份验证组件;
(7)身份验证组件使用基于声明的用户令牌将请求重定向资源地址;
(8)执行请求管道的其余部分并将响应发送回请求的客户端,至此登录与授权完成。
2.2 身份验证模式
在SharePoint Server 2010系统中,提供了两种身份验证模式:Classic Mode Authentication和Claims Based Authentication。
(1)Classic Mode Authentication:经典模式身份验证。即用户认证和用户身份都使用标准的Windows身份认证机制,并且SharePoint会将用户账户视为Active Directory域服务(AD DS)账户。在登录过程中通过协商(NTLM/Kerberos)使用集成Windows身份验证质询执行登录过程。由于在此模式下并不进行声明扩充,因此用户登录后,SharePoint中的一些功能(如:对服务应用程序和自定义声明提供程序的多用户支持)将不起作用。
(2)Claims Based Authentication:基于聲明的身份验证。即用户的身份是以多个Claim(声明)来标识的,例如Name=User,就可被视为是一个Claim。多个Claim组合成为声明集合(Claims)。SharePoint在执行此模式的登录过程中,会自动将WindowsIdentity对象转换为ClaimsIdentity对象(一种表示基于声明的用户表示形式)。所有的声明登录认证类型都依赖于被动登录,是在HTTP协议中的302重定向到的单独登录页中进行的。同时此模式是基于Windows Identity Foundation构建,可以对基于声明的身份验证使用任何受到支持的身份验证方法,例如使用基于SAML的令牌中包含的声明。基于此验证模式还可以使用其他声明来扩充用户令牌,以便在SharePoint中实现更多自定义身份信息扩展。
但实际上SharePoint Server 2010不但实现了上面的两种身份验证模式,同时还引入了以安全声明标记语言(SAML)为基础的基于令牌的身份验证方法。
3 SAML
SAML的全称是Security Assertion Markup Language(安全断言标记语言),它是由两项较早的安全协议S2ML(Security Service Markup Language)和AuthXML(Authorization Markup Language)派生出的一个基于XML的标准,用于在不同的安全域,即在身份提供者(Identity Provider)和服务提供者(Service Provider)之间进行交换、认证以及授权数据,同时为认证、授权、策略断言提供标准机制,实现交换相关主体的安全断言信息的目的。SAML通常被用于跨安全边界对用户进行身份验证和授权。针对不同目的,SAML提供以下几种不同类型的安全断言:
* 认证断言(Authentication Assertion):认证断言用来声称消息发布者已经认证特定的主体。
* 属性断言(Attribute Assertion):属性断言声称特定主体具有特定的属性。属性可通过URI(统一资源标识)或用来定义结构化属性的一种扩展模式进行详细说明。
* 决定断言(Decision Assertion):一个决定断言报告了一个具体授权请求的结果。
* 授权断言(Authorization Assertion):授权断言声称一个主体被给予访问一个或多个资源的特别许可。
SAML断言以XML结构描述且具有嵌套结构,由此一个断言可能包括几个关于认证、授权和属性的不同内在断言(包括认证声明的断言仅仅描述那些先前发生的认证行为)。
3.1 SAML安全令牌
令牌是陈述有关标识的信息的一组字节。这些信息包含一个或多个声明,每个声明都包含有关应用此令牌的使用者的一些信息。令牌中的声明通常包含提供令牌的用户的姓名等信息,还包含许多类型的其他信息。其存储可包含在Active Directory域服务、SQL Server数据库或LDAP中。
安全断言标记语言(SAML)令牌是声明的XML表示形式。SAML令牌包含由一个实体所生成的关于另一实体的多组声明的语句。例如,在联合安全方案中,语句是由安全令牌服务针对系统中的某一用户所生成的。安全令牌服务将对SAML令牌进行签名,以指示令牌中所包含语句的真实性,这就向依赖方证明了SAML令牌实际上是颁发给该用户的。
从客户端请求获得SAML令牌到服务器返回结果,主要经历如下4个阶段:
(1)客户端向安全令牌服务请求 SAML 令牌,并通过使用证书(例如X509)对该安全令牌服务进行身份验证
(2)安全令牌服务向客户端颁发SAML令牌。SAML令牌使用与安全令牌服务关联的证书进行签名,并包含针对目标服务所加密的校验密钥
(3)客户端还将接收校验密钥的副本,然后将SAML令牌提交到应用程序服务(依赖方)并使用该校验密钥对消息进行签名
(4)依赖方可通过SAML令牌上的簽名了解到,该令牌是由安全令牌服务颁发的;依赖方还可通过使用校验密钥创建的消息签名了解到,该令牌是颁发给客户端的
当Web应用程序的登录配置为接受来自受信任登录提供程序的令牌时,这种类型的登录称为SAML被动登录。受信任登录提供程序是SharePoint信任的外部(即SharePoint的外部)安全令牌服务(STS)。在SAML被动登录过程中,客户端将被重定向到指定的声明提供程序。当该声明提供程序对用户进行身份验证后,SharePoint将获得声明提供程序提供的SAML令牌,处理SAML令牌,然后扩充声明。对于基于SAML的声明提供程序,使用SAML被动登录模式进行登录是唯一受支持的方式。
通过以上步骤,我们可以清楚了解到,安全令牌服务是作为SharePoint登录验证的重要组件存在于整个流程中,并且可以通过互信方式,使得SharePoint可以信任其他符合工业标准的安全令牌服务程序。SAML安全令牌服务作为SharePoint与第三方认证系统的中间桥梁,成为整个认证系统中设计的关键。
3.2 SAML安全令牌服务
安全令牌服务(Security Token Service,STS)是用于根据WS-Trust和WS-Federation协议构建、签署和颁发安全令牌的Web服务组件。使用安全令牌服务的Web应用程序用以处理安全令牌的颁发、管理以及验证请求。安全令牌由标识声明(如用户的名称、角色或匿名标识符)的集合组成。安全令牌可以通过多种形式颁发给客户端,例如以安全声明标记语言(SAML)令牌形式颁发。通常情况下为了保证传输的安全性,可以用X.509证书保护安全令牌内容在传输过程中的安全并启用对可信颁发者的验证。
安全令牌服务分为两种:标识提供方STS(IP-STS)和信赖方STS(RP-STS),其中IP-STS 使用Windows集成身份验证等机制对客户端进行身份验证。它会根据客户端提供的声明来创建SAML令牌,并且可以添加自己的声明。信赖方应用程序(RP)会接收SAML令牌,并使用令牌内部的声明来决定是否向客户端授予所请求资源的访问权限。RP-STS不对客户端进行身份验证,而是依赖信任的IP-STS提供的SAML令牌。通常情况下IP-STS位于客户端所在的域中,而RP-STS位于RP所在的域中,下图显示了这种情况。
如果第三方认证系统或者自己的包含IP-STS的环境需要实现基于SAML令牌的身份验证,那么就需要IP-STS与合作伙伴STS之间建立信任关系。
在SharePoint中IP-STS是一种处理可信标识声明请求的Web服务,其使用一种被称为标识存储区的数据库来存储和管理标识及其关联属性。标识提供程序的标识存储区可以是简单的存储区,例如SQL数据库表。也可以是复杂的标识存储区,如Active Directory 域服务(AD DS)或Active Directory轻型目录服务(AD LDS)。IP-STS通常被用于想要创建和管理标识的客户,以及必须验证客户向其提供的标识的信赖方应用程序。实际中每个IP-STS都与信赖方的STS Web应用程序(每个都称为RP-STS)之间存在信任关系,并向这些STS Web应用程序颁发令牌。客户的请求包含在IP-STS中安全令牌时,将会与IP-STS发生交互。验证成功后,IP-STS会颁发一个可信安全令牌,客户可将该令牌提供给信赖方应用程序。信赖方应用程序可与IP-STS建立信任关系,从而使这些应用程序可以验证IP-STS颁发的安全令牌。建立信任关系后,信赖方应用程序可以检查客户提供的安全令牌,并决定令牌包含的标识声明的有效性。
信赖方STS(RP-STS)是接收来自可信联盟合作伙伴IP-STS的安全令牌的STS。RP-STS反过来又颁发新的安全令牌供本地信赖方应用程序使用。通过将RP-STS Web应用程序与IP-STS Web应用程序联合使用,向用户提供单点登录。
用于实现基于SAML令牌的提供程序的体系结构需要包含以下组件:
* 安全令牌服务,该服务将创建由服务器场使用的 SAML 令牌。
* 令牌签名证书(Import Trust Certificate),这是从IP-STS导出的证书。该证书将复制到服务器场中的一台服务器上。
* 标识声明,标识声明是来自SAML令牌的声明,它是用户的唯一标识符。只有IP-STS的所有者知道令牌中的哪个值对每个用户始终是唯一的。
* 其他声明,这些声明由来自SAML票证、用于描述用户的其他声明组成。其中可能包括用户角色、用户组或其他种类的声明(如年龄)。
* 领域,在SharePoint声明体系结构中,与配置为使用基于SAML令牌的提供程序的 SharePoint Web应用程序关联的URI或URL代表领域。
* 信赖方安全令牌服务(RP-STS)。
* 标识提供程序安全令牌服务(IP-STS)。
4 接入设计集成
由于基于声明的身份验证基于Windows Identity Foundation(WIF)而构建,而Windows Identity Foundation (WIF)是一种用于快速搭建支持声明认证方式和SAML安全令牌服务的框架,其核心功能之一是创建和读取SAML安全令牌,并能够自动分析第三方认证系统生成的继承于IIdentity和Iprincipal接口的对象,并自动将其包装为SAML令牌进行传输,所以第三方认证系统必须能够生成符合标准的IIdentity和Iprincipal接口对象,并能够在声明感知应用程序和STS之间建立信任关系,使得第三方认证系统顺利接入SharePoint Server 2010。
由于SharePoint Server 2010是基于Microsoft .Net Framework 3.5构建的,因此可以使用Visual Studio 2010建立基于WIF的STS站点。在建立站点的过程中WIF在Visual Studio 2010中创建STS站点时,会自动创建与STS站点同名的X.509证书。由于此证书不是任何受信任的证书发行机构颁布的,不能直接让STS与SharePoint Server 2010之间建立信任关系,因此必须将此证书和证书链添加到SharePoint Server 2010所在服务器中受信任的根证书颁发机构中。然后再将证书导出为DER编码二进制X.509证书,并将导出的证书通过SharePoint Server 2010系统管理中心的“管理信任”功能上传,这样才能建立STS与SharePoint的信任关系。
在建立信任关系后,还需要考虑实现以下过程:
(1)定义将用作用户的唯一标识符的声明。应与 IP-STS 的管理员协商确定正确的标识符,因为只有IP-STS的所有者知道令牌中的哪个值对每个用户始终是唯一的。确定用户的唯一标识符是声明映射过程的一部分。
(2)使用Windows PowerShell创建新身份验证提供程序以导入令牌签名证书。该过程将创建SPTrustedIdentityTokenIssuer,完成后还需要创建和指定与基于SAML令牌的身份验证配置的第一个SharePoint Web应用程序关联的领域。
(3)在SPTrustedIdentityTokenIssuer的每个领域中,必须在IP-STS上为其分别创建一个RP-STS条目。
(4)由于SAML STS站点只是负责颁发安全令牌的机构,并不对用户的身份认证机构,这要由认证工作交由第三方认证系统完成。在STS站点中的Web.Config文件中增加第三方认证系统的HttpModule,这样在SharePoint请求STS站点时,会将请求重定向到认证系统进行用户身份的验证工作。完成验证后,STS站点会自动识别第三方身份认证系统生成的IIdentity和Iprincipal接口对象,并将其自动包装为SAML安全令牌传输至SharePoint,完成单点登录,最终完成第三方系统通过SAML STS接入SharePoint Server 2010。
整个登录流程的UML时序图如下:
(1)用户请求SharePoint Server 2010系统的资源页面。
(2)SharePoint Server 2010判定该请求没有被有效认证,同时通知浏览器重新定向到SAML STS站点请求SAML安全令牌。
(3)请求SAML STS验证页面获取安全令牌。
(4)SAML STS作为第三方认证系统的Client,在经过第三方认证系统的验证后才能访问STS。SAML STS站点下Web.Config所配置的httpModules拦截了该未经认证的请求,并把请求重新定向到第三方认证系统的登录页面。
(5)请求第三方认证系统站点。用户在登录页面提交用户名和密码。
(6)第三方认证系统验证提交的用户名和密码。
(7)认证成功后向浏览器发出Pass Port Server Cookie并重定向至SAML STS站点。
(8)使用带有Token的参数地址请求SAML STS站点。第三方认证系统的AuthenticationModule此时认证token值合法后放行。
(9)SAML STS识别IIdentity和Iprincipal接口对象,并封装为SAML安全令牌,同时向浏览器发出STS security tokens和STS Cookie并重定向到SharePoint站点。
(10)浏览器带着STS security tokens向门户站点发出请求。SharePoint站点下的Web.config中的WSFederationAuthenticationModule验证STS security tokens的有效性。
(11)为了后续的请求不再需要带上STS security tokens,SharePoint向客户端发出FedAuth Cookie,使登录状态信息实现持久化。
5 结论
SAML是一个完全开放的标准,结合SAML进行SharePoint的单点登录,能够更为安全和具有互操作性。所以说,借助现有的商业或者开源产品,在SharePoint Server 2010系统中实现基于SAML的身份认证系统接入集成还是非常容易实现的,并且可以满足日常安全需求,同时这种技术基于标准的机制,易于维护和扩展,也易于实现不同域之间的互操作。通过本例的实现,使得企业在通过SharePoint集成业务系统时的单点登录难题得以解决,大大降低了企业业务系统集成成本。