3.8.3. 安全令牌服务(STS)
安全令牌服务(STS)是 WS-Trust 规范的核心。它是一种基于标准的验证和授权机制。STS 是基于令牌格式、命名空间或信任边界的 WS-Trust 规范协议用于发布、交换和验证安全令牌的一种实施。STS 是一个 Web 服务,充当可信第三方,以代理 Web 服务请求者和 Web 服务提供商之间的信任关系。它是请求者和提供商信任的常用接入点,可提供可互操作的安全令牌。它免除了请求者和供应商之间直接关系的需求。STS 有助于确保跨域和不同平台之间的互操作性,因为它是基于标准的身份验证机制。
STS 的 WSDL 合同定义了其他应用程序和进程如何与之交互。特别是,WSDL 定义了 WS-Trust 和 WS-Security 策略,请求者必须遵守这些策略才能与 STS 的端点成功通信。Web 服务请求者使用 STS 的 WSDL,并且在 STSClient
实用程序的帮助下,生成符合所声明安全策略的消息请求并将其提交到 STS 端点。STS 验证请求并返回适当的响应。
3.8.3.1. 配置 PicketLink WS-Trust 安全令牌服务(STS)
PicketLink STS 提供构建 Apache CXF 安全令牌服务实施的替代方案的选项。您还可以使用 PicketLink 为 Web 应用配置 SAML SSO。有关使用 PicketLink 配置 SAML SSO 的更多详细信息,请参阅如何使用 SAML v2 设置 SSO。
要将应用程序设置为 PicketLink WS-Trust STS,必须执行以下步骤:
- 为 WS-Trust STS 应用程序创建安全域。
-
为 WS-Trust STS 应用程序配置
web.xml
文件。 - 为 WS-Trust STS 应用程序配置身份验证器。
- 声明 WS-Trust STS 应用所需的依赖关系。
- 配置 WS-Trust STS 应用程序的 web-service 部分。
-
为 WS-Trust STS 应用创建和配置 picket
link.xml
文件。
在创建和部署应用之前,应创建和配置安全域。
3.8.3.1.1. 为 STS 创建安全域
STS 根据提供的凭据处理主体的身份验证,并根据结果发布正确的安全令牌。这要求通过安全域配置身份存储。创建此安全域和身份存储的唯一要求是其已正确定义了身份验证和授权机制。这意味着,可以利用许多不同的身份存储(如属性文件、数据库和 LDAP)以及它们关联的登录模块来支持 STS 应用。如需有关安全域的更多信息,请参阅 JBoss EAP 安全架构文档中的安全 域部分。
在以下示例中,使用一个简单的 UsersRoles
登录模块,该模块使用身份服务的属性文件。
用于创建安全域的 CLI 命令
/subsystem=security/security-domain=sts:add(cache-type=default)
/subsystem=security/security-domain=sts/authentication=classic:add
/subsystem=security/security-domain=sts/authentication=classic/login-module=UsersRoles:add(code=UsersRoles,flag=required,module-options=[usersProperties=${jboss.server.config.dir}/sts-users.properties,rolesProperties=${jboss.server.config.dir}/sts-roles.properties])
reload
生成 XML
<security-domain name="sts" cache-type="default"> <authentication> <login-module code="UsersRoles" flag="required"> <module-option name="usersProperties" value="${jboss.server.config.dir}/sts-users.properties"/> <module-option name="rolesProperties" value="${jboss.server.config.dir}/sts-roles.properties"/> </login-module> </authentication> </security-domain>
显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南。
属性文件
UsersRoles
login 模块利用属性文件来存储用户/密码和用户/角色信息。有关 UsersRoles
模块的更多详情,请参阅 JBoss EAP 登录模块参考。在本例中,属性文件包含以下内容:
示例: sts-users.properties
文件
Eric=samplePass Alan=samplePass
示例: sts-roles.properties
File
Eric=All Alan=
您还需要创建用于签名和加密安全令牌的密钥存储。配置 picket link.xml 文件时将
使用此密钥存储。
3.8.3.1.2. 为 STS 配置 web.xml 文件
STS 的 web.xml
文件应包含以下内容:
-
一个
<servlet>
,用于启用 STS 功能和<servlet-mapping> 来
映射其 URL。 -
带有
<
,其中包含一个web-resource-collection> 的 <security-constraint
><url-pattern>
,它映射到安全区域的 URL 模式。另外,<security-constraint>
也可以包含<auth-constraint> 来
替代允许的角色。 -
为 BASIC 身份验证
配置 <login-config>
。 -
如果在
<auth-constraint>
中指定了任何角色,这些角色应在<security-role>
中定义。
web.xml
文件示例:
<web-app> <!-- Define STS servlet --> <servlet> <servlet-name>STS-servlet</servlet-name> <servlet-class>com.example.sts.PicketLinkSTService</servlet-class> </servlet> <servlet-mapping> <servlet-name>STS-servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <!-- Define a security constraint that requires the All role to access resources --> <security-constraint> <web-resource-collection> <web-resource-name>STS</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>All</role-name> </auth-constraint> </security-constraint> <!-- Define the Login Configuration for this Application --> <login-config> <auth-method>BASIC</auth-method> <realm-name>STS Realm</realm-name> </login-config> <!-- Security roles referenced by this web application --> <security-role> <description>The role that is required to log in to the IDP Application</description> <role-name>All</role-name> </security-role> </web-app>
3.8.3.1.3. 为 STS 配置 Authenticator
身份验证器负责用户的身份验证来发行和验证安全令牌。身份验证器通过定义要在验证和授权主体时使用的安全域进行配置。
jboss-web.xml
文件应具有以下内容:
-
<security-domain>
,用于指定用于身份验证和授权的安全域。
示例: jboss-web.xml
文件
<jboss-web> <security-domain>sts</security-domain> <context-root>SecureTokenService</context-root> </jboss-web>
3.8.3.1.4. 声明 STS 的 Necessary 依赖项
Web 应用充当 STS 要求在 jboss-deployment-structure.xml
文件中定义依赖项,以便能够找到 org.picketlink
类。由于 JBoss EAP 提供所有必需的 org.picketlink
和相关类,应用只需将其声明为依赖项即可使用它们。
示例:使用 jboss-deployment-structure.xml 进行
Declare 依赖项
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.picketlink"/> </dependencies> </deployment> </jboss-deployment-structure>
3.8.3.1.5. 配置 STS 的 Web-Service 端口
Web 应用充当 STS 要求您定义一个 Web 服务,供客户端调用来获取其安全令牌。这要求您在 WSDL 中定义一个名为 PicketLinkSTS
的服务名称,以及名为 PicketLinkSTSPort
的端口。但是,您可以更改 SOAP 地址来更好地反映您的目标部署环境。
示例: PicketLinkSTS.wsdl
文件
<?xml version="1.0"?> <wsdl:definitions name="PicketLinkSTS" targetNamespace="urn:picketlink:identity-federation:sts" xmlns:tns="urn:picketlink:identity-federation:sts" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsap10="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"> <wsdl:types> <xs:schema targetNamespace="urn:picketlink:identity-federation:sts" xmlns:tns="urn:picketlink:identity-federation:sts" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" elementFormDefault="qualified"> <xs:element name="MessageBody"> <xs:complexType> <xs:sequence> <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> <wsdl:message name="RequestSecurityToken"> <wsdl:part name="rstMessage" element="tns:MessageBody"/> </wsdl:message> <wsdl:message name="RequestSecurityTokenResponse"> <wsdl:part name="rstrMessage" element="tns:MessageBody"/> </wsdl:message> <wsdl:portType name="SecureTokenService"> <wsdl:operation name="IssueToken"> <wsdl:input wsap10:Action="http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue" message="tns:RequestSecurityToken"/> <wsdl:output wsap10:Action="http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTR/Issue" message="tns:RequestSecurityTokenResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="STSBinding" type="tns:SecureTokenService"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="IssueToken"> <soap12:operation soapAction="http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="PicketLinkSTS"> <wsdl:port name="PicketLinkSTSPort" binding="tns:STSBinding"> <soap12:address location="http://localhost:8080/SecureTokenService/PicketLinkSTS"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
此外,您的 web 服务需要一个类来使用 WSDL:
示例: PicketLinkSTS
类
@WebServiceProvider(serviceName = "PicketLinkSTS", portName = "PicketLinkSTSPort", targetNamespace = "urn:picketlink:identity-federation:sts", wsdlLocation = "WEB-INF/wsdl/PicketLinkSTS.wsdl") @ServiceMode(value = Service.Mode.MESSAGE) public class PicketLinkSTService extends PicketLinkSTS { private static Logger log = Logger.getLogger(PicketLinkSTService.class.getName()); @Resource public void setWSC(WebServiceContext wctx) { log.debug("Setting WebServiceContext = " + wctx); this.context = wctx; } }
3.8.3.1.6. 为 STS 创建和配置 picketlink.xml 文件
picketlink.xml
文件负责身份验证器的行为,并在应用的启动时载入。
JBoss EAP 安全令牌服务定义多个提供扩展点的接口。可以在 中插入实施,并且可以利用配置为某些属性指定默认值。与 如何设置带有 SAML v2 的 SSO 中的 IDP 和 SP 配置类似,所有 STS 配置都在部署的应用的 picketlink.xml
文件中指定。以下是可以在 picket link.xml
文件中配置的元素:
在以下文本中,服务提供商引用需要其客户端出示安全令牌的 Web 服务。
<PicketLinkSTS>
:这是根元素。它定义了允许 STS 管理员设置以下属性的一些属性:-
STSName
:代表安全令牌服务名称的字符串。如果没有指定,则使用默认的PicketLinkSTS
值。 -
TokenTimeout
:令牌生命周期值(以秒为单位)。如果没有指定,则使用默认值3600
(一小时)。 -
EncryptToken
:指定是否要加密发布的令牌的布尔值。默认值为false
。
-
-
<KeyProvider>
:此元素及其所有子元素都用于配置 PicketLink STS 用于签名和加密令牌的密钥存储。本节中已配置密钥存储位置、密码以及签名(私钥)别名和密码等属性。 -
<TokenProviders>
:本节指定TokenProvider
实施,必须用来处理每种类型的安全令牌。在示例中,我们有两个提供程序 - 处理SAMLV1.1
类型的令牌,一个处理SAMLV2.0
类型的令牌。WSTrustRequestHandler
调用STSConfiguration
的getProviderForTokenType(String type)
方法,以获取对相应的TokenProvider
的引用。 -
<ServiceProviders>
:本节指定每个服务提供商必须使用的令牌类型,即需要安全令牌的 Web 服务。当 WS-Trust 请求不包含令牌类型时,WSTrustRequestHandler
必须使用服务提供商端点来找出必须发布的令牌类型。
在配置 PicketLink 时,建议使用 POST 绑定,因为它提供增强的安全性,且不会在 URL 参数内传递响应。
示例: picketlink.xml
配置文件
<!DOCTYPE PicketLinkSTS> <PicketLinkSTS xmlns="urn:picketlink:federation:config:2.1" STSName="PicketLinkSTS" TokenTimeout="7200" EncryptToken="false"> <KeyProvider ClassName="org.picketlink.identity.federation.core.impl.KeyStoreKeyManager"> <Auth Key="KeyStoreURL" Value="sts_keystore.jks"/> <Auth Key="KeyStorePass" Value="testpass"/> <Auth Key="SigningKeyAlias" Value="sts"/> <Auth Key="SigningKeyPass" Value="keypass"/> <ValidatingAlias Key="http://services.testcorp.org/provider1" Value="service1"/> </KeyProvider> <TokenProviders> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.wstrust.plugins.saml.SAML11TokenProvider" TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:1.0:assertion"/> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.wstrust.plugins.saml.SAML20TokenProvider" TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:2.0:assertion"/> </TokenProviders> <ServiceProviders> <ServiceProvider Endpoint="http://services.testcorp.org/provider1" TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" TruststoreAlias="service1"/> </ServiceProviders> </PicketLinkSTS>
默认情况下,opt etlink.xml
文件位于 STS Web 应用的 WEB-INF/classes
目录中。PicketLink 配置文件也可以从文件系统加载。要从文件系统加载 PicketLink 配置文件,必须将它命名为 picket link-sts.xml
,并位于 ${user.home}/picketlink-store/sts/
目录中。