WSO2 身份服务器 - 自定义 SAMLSSOAuthenticator

WSO2 Identity Server - Customize SAMLSSOAuthenticator

我想编写一个自定义联合身份验证器。这样做的原因是我想从多个数据源检索声明并将它们作为属性包含在对我的应用程序的 SAML 响应中。 我查看了自定义索赔处理程序:

http://pushpalankajaya.blogspot.ie/2014/07/adding-custom-claims-to-saml-response.html

不幸的是,当直接登录到外部 IDP 时,不应调用自定义声明处理程序。

为了创建自定义 SAMLSSOAuthenticator,我创建了一个自定义 class:

public class CustomSAMLSSOAuthenticator extends SAMLSSOAuthenticator implements FederatedApplicationAuthenticator {
    @Override
    protected void processAuthenticationResponse(final HttpServletRequest request, final HttpServletResponse response,
                                                 final AuthenticationContext context) throws AuthenticationFailedException {
    }

    @Override
    public String getName() {
        return "CustomSAMLSSOAuthenticator";
    }

    @Override
    public String getFriendlyName() {
        return "custom-samlsso";
    }                                                
}

然后我在 OSGi 中将 class 注册为 AbstractApplicationAuthenticator。我可以在日志中看到这个注册工作:

DEBUG {org.wso2.carbon.identity.application.authentication.framework.internal.FrameworkServiceComponent} -  Added application authenticator : CustomSAMLSSOAuthenticator

然后我更改 $IS_HOME/repository/conf/security/application-authentication.xml:

<AuthenticatorNameMapping name="CustomSAMLSSOAuthenticator" alias="firecrest-samlsso" />
...
<AuthenticatorConfig name="CustomSAMLSSOAuthenticator" enabled="true">

并且我从文件中删除了对 SAMLSSOAuthenticator 的引用。

从 Mgmt 控制台为我的服务提供商添加高级身份验证配置并选择联合身份验证器时,我希望看到选项 custom-samlsso,但我只看到 samlsso,并且在登录外部 IDP 时,这仍然是使用 SAMLSSOAuthenticator 而不是 CustomSAMLSSOAuthenticator 进行处理。

我还注意到在 IdPManagementUIUtil class 中,有一些 SAMLSSOAuthenticator 的硬编码,这可能表明我正在尝试做的事情不受支持:

private static void buildSAMLAuthenticationConfiguration(IdentityProvider fedIdp,
        Map<String, String> paramMap) throws IdentityApplicationManagementException {

    FederatedAuthenticatorConfig saml2SSOAuthnConfig = new FederatedAuthenticatorConfig();
    saml2SSOAuthnConfig.setName("SAMLSSOAuthenticator");
    saml2SSOAuthnConfig.setDisplayName("samlsso");
    ...
} 

知道我做错了什么吗?

首先,支持添加自定义验证器作为首选,硬编码值仅适用于默认打包的验证器。即使配置不可见,它似乎是有效的,您可以通过尝试通过它进行身份验证来验证它。只有在自定义实现中定义了配置属性时,才会显示自定义身份验证器的配置。因此,请尝试通过 Abstract class.

中的此方法添加一些属性
public List<Property> getConfigurationProperties()

另一方面,您的第一种方法应该有效。如果您可以发送代码,就可以检查出了什么问题。

替换现有 SAMLSSOAuthenticator 的方法存在问题,因为存在问题中概述的与其关联的某些硬编码。

解决方案只是添加一个新的自定义身份验证器并使其看起来尽可能接近 SAMLSSOAuthenticator:

https://docs.wso2.com/display/IS500/Writing+a+Custom+Twitter+Authenticator

我唯一的问题是让管理控制台上的配置表单看起来一样:

@Override
public List<Property> getConfigurationProperties() {
    final List<Property> properties = Lists.newArrayList();
    properties.add(createProperty(IdentityApplicationConstants.Authenticator.SAML2SSO.IDP_ENTITY_ID, null,
        "Identity Provider Entity Id", "Enter identity provider's entity identifier value", true, null, null));

    ...    
    return properties;
}    

private Property createProperty(final String name, final String value, final String label,
                                final String description, final boolean required, final String type,
                                final String defaultValue) {
    final Property property = new Property();
    property.setName(name);
    property.setValue(value);
    property.setDisplayName(label);
    property.setDescription(description);
    property.setRequired(required);
    if (type != null) {
        property.setType(type);
    }
    property.setDefaultValue(defaultValue);
    return property;
}

我不确定 属性#type 的有效值是多少? 无法确定是否可以使用 属性 类型创建复选框和单选按钮?