在 WebSphere 8.5 上使用 JASPIC 身份验证模块



我有一个JASPIC auth模块,在GlassFish,WildFly和WebLogic上运行得很好。

现在我们有一个新客户使用 WebSphere 8.5,我无法让身份验证模块在那里正常运行。

问题是 WebSphere 不接受身份验证模块放入 CallerPrincipalCallback 中的用户名。我们的其他支持的服务器只是接受这一点,但 WebSphere 出于某种原因认为它需要执行一些额外的检查。

在调查了这个问题之后,我偶然发现了这个问题:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014937852

这完全描述了我的问题,但那里没有给出解决方案。

如何将 WebSphere 限制为只处理 CallerPrincipalHandler 并像所有其他服务器一样接受任何用户名?

归因于 WebSphere 8.5 的行为,WRT 处理 JASPIC CallerPrincipalCallback 与 JASPIC 规范不兼容。

调用者主体回调必须能够支持用户注册表集成在 SAM 中,包括用于提供用户组成员身份的目的。

对于基于密码的验证的特殊情况,SAM 可以调用容器提供的 CallbackHandler 来处理 PasswordValidationCallback;在这种情况下,如果与容器的 CallbackHandler 集成的用户注册表中不存在用户名和/或密码组合,则 CallbackHandler 将返回失败结果。在这种情况下,SAM 将返回失败(或延续)身份验证结果,并且不会调用 CallbackHandler 来处理 CallerPrincipalCallback。

呵呵,

罗恩·蒙齐洛

一般来说,如果可能的话,我通常建议使用容器身份验证/授权,因为它已经由服务器基础设施提供,并且在大多数情况下已经足够了。

但是,如果您在您的情况下需要它,这里有一些提示。

如果要避免额外的检查,并允许对不在 WebSphere 用户注册表中的用户进行身份验证,那么您必须像这样创建完整的主题(这是固定的用户简化),而不是使用回调:

public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject,
        Subject serviceSubject) throws AuthException {
   String uniqueid = "test";
   String username = "test";
   String password = "test";
   Hashtable hashtable = new Hashtable();
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid);
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password);
   List groups = new ArrayList();
   // if you want to use existing group uncomment this
   // com.ibm.websphere.security.UserRegistry reg = 
   //  (com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");    
   // String groupID reg.getUniqueGroupId("testers");
   // groups.add(groupID); // for federated registry it returns cn=testers,o=defaultWIMFileBasedRealm

   // if you want to use fake groups just add them here, and provide correct binding file - see below. If you don't want to use groups just omit WSCREDENTIAL_GROUPS  
   groups.add("testers");
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groups); //optional 
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid);
   clientSubject.getPrivateCredentials().add(hashtable);
   return AuthStatus.SUCCESS;
}

我假设您希望将这些用户映射到应用程序中的某些安全角色。您可以使用用户、组或特殊主题对其进行映射。您需要在application.xml中定义角色,如下所示:

<security-role>
    <role-name>user</role-name>
</security-role>

您将需要绑定文件,因为无法通过控制台为不存在的用户/组完成绑定。创建ibm-application-bnd.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<application-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_2.xsd"
version="1.2">
  <security-role name="user">
    <user name="test" access-id="user:defaultWIMFileBasedRealm/test"/>
    <group name="testers" access-id="group:defaultWIMFileBasedRealm/testers"/>
    <special-subject type="ALL_AUTHENTICATED_USERS" />
  </security-role>
</application-bnd>

我提供了各种映射的示例,请使用适合您需求的映射:

  • user - 用于将指定用户映射到角色
  • group - 用于将组映射到角色
  • special-subject - 如果您希望任何成功进行身份验证的用户具有该角色。

重要的是,如果要使用虚假用户/组,则必须提供access-id属性,如果它们在注册表中,则只需提供name

另请参阅:

  • 开发定制 JASPI 认证提供程序

相关内容

  • 没有找到相关文章

最新更新