【问题标题】:How to validate WS-Federation SAML tokens with Java Service Provider如何使用 Java 服务提供者验证 WS-Federation SAML 令牌
【发布时间】:2013-05-01 01:50:56
【问题描述】:

我正在开发一个项目,该项目使用 ws_federation 和 SAML 向在 .net 上运行的 IIS 服务器上运行的身份提供程序进行身份验证,名为 thinktecture

我需要编写一个 Java 服务提供者,它将 SAML 身份验证请求发送到身份提供者,并在我的 Java Web 应用程序上获取 SAML 响应。

我需要知道是否有任何好的库来验证 SAML,并可能提供一些设置方向或指向入门教程的链接。我尝试了 spring_security-saml_extensions,但是当我尝试将身份提供者元数据链接放入配置文件时,我不断收到错误。

任何帮助将不胜感激!

另外:如果该解决方案可以集成到现有的 Java Web 应用程序中,那就太好了!

一些附加信息:

以下是我可以从我正在处理的 SP 中的 IDP 返回的响应中获得的 XML,我的印象是这是一个 SAML 令牌。

<trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<trust:RequestSecurityTokenResponse Context="rm=0&amp;id=passive&amp;ru=%2fApplicant%2fMyAccount%2fHome">
    <trust:Lifetime>
        <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2013-04-17T19:37:18.399Z</wsu:Created>
        <wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2013-04-17T20:07:18.399Z</wsu:Expires>
    </trust:Lifetime>
    <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
        <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
            <wsa:Address>https://[SP Server]/</wsa:Address>
        </wsa:EndpointReference>
    </wsp:AppliesTo>
    <trust:RequestedSecurityToken>
        <Assertion ID="_b4c87094-9557-419f-92fd-714a2b9cd8af" IssueInstant="2013-04-17T19:37:18.399Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
            <Issuer>http://[IDP Server]/trust/idp</Issuer>
            <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
                <SignedInfo>
                    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
                    <Reference URI="#_b4c87094-9557-419f-92fd-714a2b9cd8af">
                        <Transforms>
                            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </Transforms>
                        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                        <DigestValue>pVpyzVN6Cz7NRNsp+jSVQP4ILt1J8y/4KBPzAtbllMg=</DigestValue>
                    </Reference>
                </SignedInfo>
                <SignatureValue>NnTCfQE7p1FmrdbmYk+wRpbaZ5Rr4Opk67mI2Y6+PTdQlUErv5Bt8C/iBA398CwAgZyREqZfobd47QnxZYOvnFjiMSsQAndmPejZ9PEGwdu8hVrYyhV2VpcPtcaew/tOGWBvTdUKH5YjGmTHLtLxny0WaGYIquYVWoO3S68duy6DWXr/rxMzOEjNhY3s/3alCYMSYqDrhB8jKY8M9M2jruZa2KjIziumW6bzksizYSEFAcn4LfVhACaucrBAVch+r31vKAxO0BpkU7wSRBTaQV+/ALmA1HJAVO/mecujHJnhpizF4GDNdsnbIxck3r/2X9gt7WgMhfwBW+6Xvd2whQ==</SignatureValue>
                <KeyInfo>
                    <X509Data>
                        <X509Certificate>MIIC5TCCAc2gAwIBAgIQSuU/gl5tP49ARSN2SkVRKzANBgkqhkiG9w0BAQUFADAaMRgwFgYDVQQDEw9XTVN2Yy1VU0FKLURFVjEwHhcNMTAxMDAxMTI1MjUxWhcNMjAwOTI4MTI1MjUxWjAaMRgwFgYDVQQDEw9XTVN2Yy1VU0FKLURFVjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgytRM5b2B35ydz+zxt59fklaT02z4AXUd9zm3h7Clq8LZYPMYvHOkzv7tgY38rD+NvmELAzeESBTbHN/wJyFkVbdD3mHVvE/vARGLxZB1lx+JN+gNjrrXT90FQtyWEchWoUcO6eFTAUdLgLonSn7SvI7lze2YUIS9BBc0OdpZzhDnWecUA1N0c5CeMZcjxroZYTuXH1YDGqOacphtZ7TMwCV2V5i7k9Jj4xY8uuSX92l7cW+EIqoqp26XTWmfon/jvDvWe3Dhe/mdtLXKQ2Lu8KCiN+zqA91fiGwezTkoeyDrWh/8/jqoz7Ep/4BN9cNLrbk75ngiryPlGLOCQK7vAgMBAAGjJzAlMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA4GA1UdDwQHAwUAsAAAADANBgkqhkiG9w0BAQUFAAOCAQEAVTHuMl7Tr+ZAQOLf9nPbAlFabec8DFb+3jzbo4qUfGD/DYGuDg4gFNfr09s2Ft82DzXf1BQJDprRIRtrQOE8hDpOeM6c5sOXk7xKh0QjPzqE4n7ZJUP8X+NW+Zu9D7OaFSJ0/mUffw/PugoYTusfCEudrKzo2CDgtrQjaTrm7zkxksJdH/DY+YCF1g+ljpUDKR9SYwRaGQ5fj9dn+SMibhcXqDXod+BGKW9xaTo3CLFKSbMRt97LjF+P8sfnq8IGTpHqHR3pFDjdbIQ4ixRCygEpbVZJgXPvcTk2Nnvi3SyLZPeTRTGnZM0R7KMhLji2JnHYEXArC46fVwHtjLGbGw==</X509Certificate>
                    </X509Data>
                </KeyInfo>
            </Signature>
            <Subject>
                <NameID>e8f279d7-cbd8-468d-a6df-97419729fe59</NameID>
                <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" />
            </Subject>
            <Conditions NotBefore="2013-04-17T19:37:18.399Z" NotOnOrAfter="2013-04-17T20:07:18.399Z">
                <AudienceRestriction>
                    <Audience>https://[SP Server]</Audience>
                </AudienceRestriction>
            </Conditions>
            <AttributeStatement>
                <!-- Data from my database-->
            </AttributeStatement>
            <AuthnStatement AuthnInstant="2013-04-17T19:37:18.337Z">
                <AuthnContext>
                    <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
                </AuthnContext>
            </AuthnStatement>
        </Assertion>
    </trust:RequestedSecurityToken>
    <trust:RequestedAttachedReference>
        <SecurityTokenReference d4p1:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" xmlns:d4p1="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_b4c87094-9557-419f-92fd-714a2b9cd8af</KeyIdentifier>
        </SecurityTokenReference>
    </trust:RequestedAttachedReference>
    <trust:RequestedUnattachedReference>
        <SecurityTokenReference d4p1:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" xmlns:d4p1="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_b4c87094-9557-419f-92fd-714a2b9cd8af</KeyIdentifier>
        </SecurityTokenReference>
    </trust:RequestedUnattachedReference>
    <trust:TokenType>urn:oasis:names:tc:SAML:2.0:assertion</trust:TokenType>
    <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
    <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
</trust:RequestSecurityTokenResponse>

【问题讨论】:

  • 你在使用 weblogic 服务器吗?
  • @VKSingla 不,不是。它在 thinktecture 上运行,这是一个开源 .net 产品
  • 你看到下面的答案了吗?有帮助吗?
  • @Michael 我唯一的困惑是我认为的术语之一......我的问题中的 xml 是内部带有 SAML 令牌的 ws-federation 响应,还是 SAML 响应? OpenSAML 可以处理来自 thinktecture IDP 的响应吗?
  • 好的,根据 XML,它是 WS-Trust 而不是 SAML xml:docs.oasis-open.org/ws-sx/ws-trust/200512/ws-trust-1.3-os.html 你应该找到支持的库(OpenSAML 仍然没有)

标签: java single-sign-on saml ws-federation


【解决方案1】:

我在 github 上找到了一个很棒的库,它可以处理 SAML 令牌的验证,如果您喜欢冒险,这是一个关于如何使用 OpenSAML 的好教程。 该库称为Auth10-Java,它在分解 SAML 令牌验证方面做得很好。仅供参考,它还处理 WS-Federation 协议。

Public List<Claim> validateAuthenticationResponse(String yourToken){
    SamlTokenValidator validator = new SamlTokenValidator();

    validator.setThumbprint("thumbprint from the thinktecture idp server or what ever idp you are using");

    validator.getAudienceUris().add(new URI(“http://localhost:8080/javafederationtest”);

    //validator.setValidateExpiration(false); //This can be used to stop validation of the expiration fields in the token.

    List<Claim> claims = validator.validate(yourToken); //A Federation Exception is thrown if the token is invalid

    System.out.println(claims.toString()); //This will show the claims asserted by the token!
}

这对我来说非常有用,而且我正在从这个库中学习大量关于 SAML 和 OpenSAML 的知识!请确保在您的项目构建路径中包含所有依赖项!

【讨论】:

    【解决方案2】:

    好消息是有开源 Java SAML 堆栈,例如 Java Oracle OpenSSO Fedlet

    坏消息是您使用的 IdentityServer 产品不支持 SAML。

    它支持 SAML tokens,但不支持 SAML protocol

    【讨论】:

    • 这是否意味着我无法从身份服务器验证 saml 令牌?
    • 否 - IdentityServer 可以验证令牌,但令牌将使用 WS-Fed 而不是 SAML 发送。
    【解决方案3】:

    请看 Shibboleth:http://shibboleth.net/products/service-provider.html。 将 Java 与 Shibboleth 集成的最简单方法是使用 Shibboleth 设置 Apache httpd,并从请求中获取 HTTP REMOTE_USER 标头:https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPJavaInstall。 Shibboleth 是一个很棒的框架,完全支持 SAML 协议。

    您还可以使用 Java 代码并使用 OpenSAML 代码自行创建 SP 代码。 OpenSAML 是 Shibboleth 使用的库(上面的链接)。 如何开始开发的说明:https://wiki.shibboleth.net/confluence/display/OpenSAML/OSTwoDeveloperManual

    【讨论】:

    • 感谢您的回答!这对于现有的 java 站点将如何工作?如果 Java Web 应用在 Tomcat 或 Glassfish 上运行,是否需要第二个 Web 服务器?
    • 不幸的是,Shibboleth 没有与 Tomcat 或 Glassfish 集成。您需要安装 Apache httpd 服务器。
    猜你喜欢
    • 2014-11-27
    • 2015-08-26
    • 2019-02-25
    • 2012-08-07
    • 2013-10-26
    • 2016-10-24
    • 1970-01-01
    • 2011-04-25
    • 2014-04-24
    相关资源
    最近更新 更多