认证
在 Liberty 安全性中,认证就是确认用户的身份。
要访问受保护的 Web 资源,用户必须提供凭证数据(例如,用户标识和密码)。认证过程涉及收集此用户凭证信息(基于 Web 应用程序配置成收集此数据的方式)并针对所配置注册表验证此信息。验证凭证信息时,会为该用户创建 JAAS 主体集。该主体集包含有关用户的其他信息,例如用户所属的组以及为该用户创建的令牌。然后在授权过程中使用此主体集中的信息来确定用户是否可以访问资源。
下图说明 Web 资源的典型认证过程流程。

认证过程涉及从用户收集凭证数据,检查高速缓存以查看是否存在该用户的主体集,如果不存在,那么调用 JAAS 服务来执行认证以创建主体集。JAAS 服务会调用一组登录模块来处理认证。一个或多个登录模块会根据凭证数据来创建主体集。登录模块随后会调用已配置成验证凭证信息的注册表。如果验证成功,那么认证过程会为该用户收集和创建相关信息,其中包括用户所属的组以及用于 SSO 功能的单点登录 (SSO) 令牌,然后将这些信息存储为主体集中的相关凭证。在此过程中,您也可以通过插入定制登录模块来定制主体集中保存的信息。
用户注册表
验证用户的认证数据时,登录模块会调用已配置成验证用户信息的用户注册表。Liberty 概要文件支持基于配置的简单用户注册表及基于 LDAP 的更稳健的存储库。有关更多信息,请参阅为 Liberty 概要文件配置用户注册表。
通过使用 LDAP 注册表,您还可以联合多个存储库以及对两个或两个以上的注册表执行 LDAP 操作。Liberty 概要文件用户可以直接在 server.xml 文件中配置 LDAP 注册表联合功能部件,也可以在开发者工具中的 LDAP 注册表联合部分进行配置。配置联合存储库后,可针对您要执行的任何操作获取联合存储库的合并结果。例如,如果您想要对所有以 test 开头的用户名执行搜索操作,那么可以对一组 LDAP 注册表执行搜索,您将获得合并搜索结果,然后可以将此搜索结果发送回调用程序。
认证高速缓存
因为创建主体集代价颇高,所以 Liberty 概要文件会在成功认证用户之后提供认证高速缓存来存储主体集。高速缓存的缺省到期时间为 10 分钟。如果用户未在 10 分钟之内重新登录,那么会移除主体集并重复认证过程以便为该用户创建主体集。如果对配置所作的更改(例如,添加登录模块或者更改 LTPA 密钥)会影响主体集的创建,那么这些更改将导致清除认证高速缓存。如果对主体集进行了高速缓存,但注册表中的信息发生更改,那么会使用注册表中的信息来更新高速缓存。您可以配置高速缓存超时时间段和高速缓存大小,还可以禁用或启用高速缓存。有关更多信息,请参阅在 Liberty 概要文件上配置认证高速缓存。
JAAS 配置
- system.WEB_INBOUND
- 访问 Web 资源(例如 servlet 和 JSP)时使用。
- WSLogin
- 使用程序化登录时供应用程序使用。
- system.DEFAULT
- 未指定任何 JAAS 配置时用于登录。
system.DESERIALIZE_CONTEXT
反序列化安全上下文时使用。此 JAAS 配置处理认证以在序列化安全上下文时重新创建在线程上处于活动状态的主体集。通过在 server.xml 文件中编辑 JAAS 配置条目,可指定此 JAAS 配置并添加您自己的定制 JAAS 登录模块以确保所传播主体集包含您的定制信息。
除非您想要使用定制登录模块来进行定制,否则不需要任何显式配置。您可以根据需求来定制特定登录配置。例如,如果您想要定制所有 Web 资源登录,那么只能向 system.WEB_INBOUND 配置添加定制登录模块。请参阅为 Liberty 概要文件配置 JAAS 定制登录模块。
JAAS 登录模块
JAAS 配置使用一组登录模块来创建主体集。Liberty 概要文件会在每项登录配置中提供一组登录模块。特定登录模块会根据认证数据来创建主体集。将如 JAAS 规范中所规定的那样,使用回调处理程序将认证数据传递到登录模块。例如,如果正在使用用户标识和密码回调处理程序进行认证,那么 userNameAndPassword 登录模块会处理认证。如果提供了 SingleSignonToken 凭证作为认证数据,那么只有令牌登录模块会处理认证。
- userNameAndPassword
- 将用户名和密码用作认证数据时处理认证。
- 证书
- 将 X509 证书用作相互 SSL 的认证数据时处理认证。
- token
- 提供 SSO 令牌作为认证数据时处理认证。在认证过程中,会创建 SSO 令牌并通过 Cookie 将其发送回 HTTP 客户端(浏览器)。在后续请求中,浏览器会发送回此 cookie,并且服务器会从此 cookie 中抽取令牌以认证用户(如果已启用单点登录)。
- hashtable
- 通过预定义的散列表来发送认证数据时使用。有关散列表登录的更多信息,请参阅散列表登录模块。如果仅使用身份来执行认证(例如,在使用 runAs 的情况下),那么安全性运行时也使用此登录模块。
- proxy
- WSLogin 的缺省登录模块。请参阅代理登录模块。
登录模块以其配置顺序进行调用。缺省顺序为 hashtable、userNameAndPassword、certificate 和 token。如果必须使用定制登录模块来定制登录过程,那么可以提供这些模块并按照所需顺序进行配置。通常,将定制登录模块放在登录模块列表的最前面,以便最先调用该定制登录模块。如果使用定制登录模块,那么必须在配置中指定所有登录模块信息并将定制登录模块置于必需顺序。
如果登录模块确定它可以处理认证,那么它会先确保所传入的认证数据是有效的。例如,对于用户名和密码认证,会调用所配置的用户注册表来验证认证信息。对于令牌认证,令牌必须加以解密且有效,才能使验证成功。
如果验证认证数据,那么登录模块会使用用户的其他数据(包括组和 SSO 令牌)来创建凭证。定制登录模块可以通过创建它自己的凭证,在主体集中添加其他数据。要使 Liberty 概要文件授权工作,主体集必须包含 WSCredential、WSPrincipal 和 SingleSignonToken 凭证。WSCredential 凭证包含组信息,以及安全性运行时环境所需的其他信息。
回调处理程序
Liberty 概要文件支持各种回调处理程序在 JAAS 认证过程中向登录模块提供数据。定制登录模块可以使用回调处理程序信息对自身进行认证。例如,如果回调处理程序需要访问 HttpServletRequest 对象中的一些信息,那么可以使用该特定回调处理程序来这样做。
- com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl
- com.ibm.wsspi.security.auth.callback.WSCallbackHandlerFactory
凭证和令牌
如登录模块部分中所述,会在创建主体集过程中创建凭证。Liberty 概要文件会创建 WSCredential、SingleSignonToken 和 WSPrincipal 凭证。SingleSignonToken 凭证包含使用 cookie 发送回浏览器以使 SSO 工作的令牌。此令牌包含用户信息和到期时间。使用服务器第一次启动期间生成的轻量级第三方认证 (LTPA) 密钥对此令牌进行签名和加密。缺省到期时间是 2 小时,是绝对时间,并不取决于用户活动。2 小时之后,令牌会到期,并且用户必须重新登录才能访问资源。
LTPA
LTPA 预期用于分布式及多应用程序服务器环境。在 Liberty 概要文件中,LTPA 通过密码术来支持分布式环境中的 SSO 和安全性。此支持使 LTPA 能对与认证相关的数据进行加密、数字签名以及安全传输,并在以后对签名进行解密和验证。
应用程序服务器可以使用 LTPA 协议安全地通信。此协议还提供 SSO 功能部件,因此,用户只有在连接至域名系统 (DNS) 时才需要进行认证。随后,用户可以访问同一个域中其他 Liberty 概要文件服务器中的资源,而不用提示用户再次进行登录。DNS 域中每个系统上的域名区分大小写,因此必须完全匹配。
LTPA 协议使用密钥来对服务器之间传递的用户数据进行加密和解密。必须在不同服务器之间共享这些密钥,才能让一个服务器中的资源访问其他服务器中的资源,这假定涉及的所有服务器都使用同一个用户注册表。LTPA 要求所配置的用户注册表必须是集中共享的存储库,这样用户和组都相同,而无论是哪个服务器。
使用 LTPA 时,会创建一个包含用户信息和到期时间的令牌,并且使用密钥对该令牌进行签名。LTPA 令牌是时间敏感的。所有参与服务器都必须同步其时间和日期。如果不同步,那么 LTPA 令牌会提早到期,并导致认证或验证失败。缺省情况下使用全球标准时间 (UTC),并且所有其他服务器都必须具有相同的 UTC 时间。有关如何确保服务器使用相同 UTC 时间的信息,请参阅操作系统文档。
如果已启用 SSO,那么会通过 Web 资源的 Cookie 将 LTPA 令牌传递到其他服务器。
如果接收服务器和发端服务器使用相同的密钥,那么可以对令牌进行解密以获取用户信息,此信息随后会加以验证以确保令牌不会过期,并确保令牌中的用户信息在其注册表中是有效的。成功验证时,便可以在授权检查之后访问接收服务器中的资源。
每个服务器都必须具有有效的凭证。当凭证到期时,需要服务器来与用户注册表通信以进行认证。如果延长 LTPA 令牌保持高速缓存的时间,那么会促使定义安全策略时考虑到安全风险会稍微提升。
如果需要在不同的 Liberty 概要文件服务器之间进行密钥共享,请将密钥从一个服务器复制到另一个服务器。为了安全起见,会使用随机生成的密钥对密钥进行加密,并使用用户定义的密码来保护密钥。将密钥导入另一个服务器时,需要此相同密码。该密码仅用来保护密钥,而不用来生成密钥。
如果已启用安全性,那么缺省情况下会在 Liberty 概要文件服务器启动时配置 LTPA。有关 LTPA 支持的更多信息,请参阅在 Liberty 概要文件上配置 LTPA。

![[8.5.5.5 或更高版本]](../ng_v8555.gif)
SPNEGO
简单且受保护 GSS-API 协商机制 (SPNEGO) 允许用户登录 Microsoft 域控制器一次就可访问 Liberty 服务器上的受保护应用程序,而不用提示用户再次进行登录。
如果已启用 SPNEGO Web 认证,并且浏览器客户机访问 Liberty 服务器上的受保护资源,那么 SPNEGO 负责认证对 HTTP 请求中标识的受保护资源的访问。浏览器客户机创建 SPNEGO 令牌并将其作为 HTTP 请求的一部分发送至 Liberty 概要文件服务器。WebSphere® Application Server 通过 SPNEGO 令牌验证并检索用户身份。此身份用于在用户与应用程序服务器之间建立安全上下文。
有关 SPNEGO
的更多信息,请参阅 SPNEGO。有关在 Liberty 概要文件服务器上配置 SPNEGO 的进一步信息,请参阅
在 Liberty 概要文件中配置 SPNEGO
认证。
单点登录 (SSO)
SSO 使用户能够登录到一个位置(例如,一个服务器)来访问其他服务器上的应用程序,而不用提示用户再次进行登录。要使 SSO 工作,必须在不同的 Liberty 概要文件服务器之间交换 LTPA 密钥,用户注册表必须相同,而且令牌不得过期。要交换 LTPA 密钥,您可以将 ltpa.keys 文件从一个服务器复制到另一个服务器,然后重新启动服务器以使用新的 LTPA 密钥。参与 SSO 域的所有服务器所使用的注册表都必须相同。
如果在一个 Liberty 概要文件服务器中对用户进行了认证,那么会将认证过程中为该用户创建的 SSO 令牌放入发送至 HTTP 客户端(例如,浏览器)的 Cookie。如果该客户机中发出另一个请求,要求访问位于另一服务器上但位于同一 DNS(配置为第一个服务器中的 SSO 配置的一部分)中的另一组应用程序,那么会随该请求一起发送 Cookie。接收服务器会尝试使用 cookie 中的令牌来认证用户。如果这两个条件都满足,那么接收服务器会验证令牌并根据此服务器中的用户创建主体集,而不会提示用户再次登录。如果无法验证令牌(例如,由于 LTPA 密钥不匹配而无法对令牌进行解密或验证),那么会提示用户重新输入凭证信息。
配置成使用 form-login 属性的任何应用程序都必须针对该服务器配置 SSO。针对 form-login 认证用户时,会将令牌发送回浏览器,并在用户访问资源时将此令牌用于为用户授权。
插入式认证
- 提供定制登录模块。大部分认证过程都基于 JAAS 登录模块,因此您可以在 Liberty 概要文件所提供的登录模块之前、之后或之间插入定制登录模块。请参阅为 Liberty 概要文件配置 JAAS 定制登录模块。
- 实现信任关联拦截器 (TAI) 以处理所有基于 Web 资源的认证。请参阅为 Liberty 概要文件开发定制 TAI。
有关 JAAS 登录模块和 TAI 的更多详细信息,请参阅 WebSphere Application Server 中的高级认证。
身份断言
除了要求请求实体来证明其身份的认证过程之外,Liberty 概要文件还支持身份断言。这是一种形式宽松的认证,不需要身份证明,但根据与实体(为断言身份作证)之间的信任关系来接受身份。
- 使用散列表登录。请参阅为系统登录配置开发 JAAS 定制登录模块。
- 使用 IdentityAssertionLoginModule。您可以允许应用程序或系统提供者通过信任验证来断言身份。要使用 IdentityAssertionLoginModule,请使用 JAAS 登录框架,在这种情况下,将在一个定制登录模块中完成信任验证,而在 IdentityAssertionLoginModule 中完成创建凭证。您可以使用两个登录模块来创建可用来断言身份的 JAAS 登录配置。需要下列两个定制登录模块:请参阅定制应用程序登录以使用 JAAS 来执行身份断言。
- 用户实现的登录模块(信任验证)
- 用户实现的登录模块会执行用户需要在信任验证中执行的任何操作。验证信任时,必须在登录模块的共享状态下将信任验证状态和登录身份放置在映射中,以便凭证创建登录模块能使用该信息。将此映射存储在下列属性中:
此属性由下列属性组成:com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.state
此属性会设置为 true(如果可信)或 false(如果不可信)。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.trusted
此属性包含身份的主体。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.principal
此属性包含身份的证书。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.certificates
- 身份断言登录模块(凭证创建)
- 下列模块会创建凭证:
此模块依靠登录上下文的共享状态中的信任状态信息。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule
身份断言登录模块会在共享状态属性中查找信任信息:
此属性包含信任状态及用来登录的身份,并且必须包含下列属性:com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.state
此属性会设置为 true(如果可信)或 false(如果不可信)。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.trusted
此属性包含使用主体时用来登录的身份的主体。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.principal
此属性包含一组证书链,内含使用证书时用来登录的身份。com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.certificates
如果缺少状态、信任或身份信息,那么会返回 WSLoginFailedException 消息。登录模块随后会使用该身份来登录,并且主体集包含新身份。
RunAs() 认证
- 传播调用者身份(缺省行为)。
- 委派给 RunAs 身份,可以通过使用 RunAs 规范来指定 RunAs 身份。
在服务器对原始用户进行认证之后,服务器随后会对 RunAs 用户进行认证。如果此认证失败,那么服务器会后退以传播调用者身份。
要使用 RunAs 规范,必须更新应用程序的部署描述符以包含 run-as 元素或 @RunAs 注释。将此元素设置为您想要委派给的安全角色。
代理登录模块
代理登录模块类会装入应用程序服务器登录模块,并将所有操作都委派给实际的登录模块实现。实际的登录模块实现是作为选项配置中的委托选项指定的。该代理登录模块是必需的,因为应用程序类装入器看不到应用程序服务器产品的共享库类装入器。借助应用程序的程序化登录(将 LoginContext 类的 Login() 方法与 JAAS 登录上下文条目 WSLogin 配合使用),代理登录模块会将所有工作都委派给 JAAS 登录上下文条目 system.DEFAULT。
证书登录
借助证书登录功能,您可以通过使用客户端 X509 证书取代提供用户标识和密码来认证诸如 servlet 等 Web 请求。
证书认证的工作方式是将用户注册表中的用户与 Web 请求的客户机证书中的专有名称相关联。通过让服务器信任客户机证书来建立信任,例如,客户机证书的签署者必须位于服务器的信任库中。使用此机制,用户不需要提供密码即可建立信任。
散列表登录模块
在用户注册表中查找必需的属性,将属性放入散列表中,然后将该散列表添加到共享状态。如果在此登录模块中切换了身份,那么您必须将散列表添加到共享状态。如果未切换身份,但是 requiresLogin 代码的值为 true,那么您可以创建属性的散列表。在这种情况下,您不必创建散列表,因为 Liberty 概要文件会为您处理登录。但是,在特殊情况下,您可以考虑创建散列表来收集属性。例如,如果您正在使用自己的专用用户注册表,那么简单的解决方案是创建 UserRegistry 实现,使用散列表,然后让服务器为您收集用户属性。
下列规则更详细地定义了如何完成散列表登录。必须在主体集(公用或专用凭证集合)或共享状态散列映射中使用 java.util.Hashtable 对象。com.ibm.wsspi.security.token.AttributeNameConstants 类定义包含用户信息的键。如果使用列在散列表登录模块之前的定制登录模块将散列表对象放入登录上下文的共享状态,请使用下列键在共享状态散列映射中搜索 java.util.Hashtable 对象的值:
- 属性
- com.ibm.wsspi.security.cred.propertiesObject
- 对属性的引用
- AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY
- 说明
- 此键搜索在登录上下文的共享状态中包含必需属性的散列表对象。
- 期望的结果
- java.util.Hashtable 对象。
如果在主体集或者共享状态区域中找到 java.util.Hashtable 对象,请验证散列表中是否存在下列属性:
- com.ibm.wsspi.security.cred.uniqueId
- 对属性的引用
- AttributeNameConstants.WSCREDENTIAL_UNIQUEID
- 返回
- java.util.String
- 说明
- 此属性值必须是用户的唯一表示。对于 Liberty 概要文件缺省实现,此属性表示应用程序授权配置中存储的信息。部署信息并执行用户到角色的映射后,此信息位于应用程序部署描述符中。如果通过查找 Liberty 概要文件的用户注册表实现来执行用户到角色的映射,请参阅所需要格式的示例。
- 所需要格式的示例
- com.ibm.wsspi.security.cred.uniqueId 属性是必需的。
表 1. uniqueId 的格式示例. 此表给出期望的格式示例。 用户注册表 格式 (UniqueUserId) 值 LDAP ldapRegistryRealm/cn=kevin,o=mycompany,c=use Basic basicRegistryRealm/kelvin
- com.ibm.wsspi.security.cred.securityName
- 对属性的引用
- AttributeNameConstants. WSCREDENTIAL_ SECURITYNAME
- 返回
- java.util.String
- 说明
- 此属性将搜索认证用户的 securityName。此名称通常称为显示名称或短名称。Liberty 概要文件对 getRemoteUser、getUserPrincipal 和 getCallerPrincipal 应用程序编程接口 (API) 使用 securityName 属性。要确保与 securityName 值的缺省实现的兼容性,请调用 public String getUserSecurityName(String uniqueUserId) UserRegistry 方法。
- 所需要格式的示例
- com.ibm.wsspi.security.cred.securityname 属性是必需的。
表 2. securityName 的格式示例. 此表给出期望的格式示例。 用户注册表 格式 (securityName) 值 LDAP kevin Basic kevin
- com.ibm.wsspi.security.cred.group
- 对属性的引用
- AttributeNameConstants. WSCREDENTIAL_GROUP
- 返回
- java.util.ArrayList
- 说明
- 此键搜索此用户所属的组的数组列表。以 realm_name/user_name 格式指定这些组。这些组的格式很重要,因为 Liberty 概要文件授权引擎使用这些组在部署描述符中进行组到角色的映射。提供的格式必须与 Liberty 概要文件缺省实现需要的格式匹配。在使用第三方权限提供者时,必须使用第三方提供程序所需的格式。要确保与唯一组标识值的缺省实现的兼容性,请调用 public List getUniqueGroupIds(String uniqueUserId) UserRegistry 方法。
- 所需要格式的示例
- com.ibm.wsspi.security.cred.group 属性是必需的。用户不需要具有关联组。
表 3. 组的格式示例. 此表提供了配置入站标识映射时的某些格式示例。 用户注册表 格式(组)值 LDAP ldapRegistryRealm/cn=group1,o=Groups,c=US Basic basicRegistryRealm/group1
- com.ibm.wsspi.security.cred.cacheKey
- 对属性的引用
- AttributeNameConstants. WSCREDENTIAL_CACHE_KEY
- 返回
- java.lang.Object
- 说明
- 这个键属性可指定表示登录唯一属性(包括可能影响唯一性的特定于用户的信息以及用户动态属性)的对象。例如,当用户从位置 A 登录时,这可能影响他们的访问控制,那么高速缓存键必须包括位置 A,以便接收到的主体集是当前位置的正确主体集。
- com.ibm.wsspi.security.cred.cacheKey 属性不是必需的。未指定此属性时,高速缓存查询是对 WSCREDENTIAL_UNIQUEID 指定的值。在 java.util.Hashtable 对象中找到此信息时,Liberty 概要文件创建的主体集类似于通过正常登录过程的主体集(至少对于 LTPA 来说如此)。新的主体集包含 WSCredential 对象和 WSPrincipal 对象,其使用散列表对象中找到的信息进行完全填充。