创建SAML断言并签署响应

时间:2014-10-21 09:07:42

标签: java single-sign-on saml-2.0 opensaml

我有一个Java Web应用程序。我想为我的应用程序实现SAML单点登录登录。我有GitHub onelogin program发送请求并获得响应。但它没有正常工作。我在那里创建了一个帐户。但我没有企业帐户。当我运行应用程序时,它将转到onelogin login页面。我尝试登录,但它没有在响应中返回任何内容,表明我没有权限。如果我也提供了错误的凭据,则不会给出任何SAML响应。

所以我决定创建一个断言并签名。

  1. 我是否需要先向任何身份提供商发送SAML请求?
  2. 如何创建示例SAML断言而不是转到IdP(Like this is fine?
  3. 收到SAML回复后,如何在我的应用程序中签名并继续?
  4. 由于

    更新1

    <?xml version="1.0" encoding="UTF-8"?>
    <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
      ID="123" InResponseTo="abc" IssueInstant="2014-11-21T17:13:42.872Z" 
      Version="2.0">
        <samlp:Status>
            <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
        </samlp:Status>
        <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
            <saml:Subject>
                <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
                    user@example.com
                </saml:NameID>
            </saml:Subject>
            <saml:AuthnStatement AuthnInstant="2014-11-21T17:13:42.899Z">
                <saml:AuthnContext>
                    <saml:AuthnContextClassRef>
                        urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
                    </saml:AuthnContextClassRef>
                </saml:AuthnContext>
            </saml:AuthnStatement>
        </saml:Assertion>
    </samlp:Response>
    

2 个答案:

答案 0 :(得分:5)

您需要做的第一件事是阅读SAML协议。我有两个可以推荐的博客。

接下来,您可以选择在应用中构建SAML集成,也可以使用第三方应用程序进行集成。典型的第三方应用是ShibbolethOpenAM

如果您决定将其构建到应用程序中,则可以使用OpenSAML。 OpenSAML是一个有助于处理SAML消息的库。 I have several blogs on the subjectone book that is good to start with

关于你的问题。

  1. 您无需发送请求。 IDP可以在没有请求的情况下启动该过程。
  2. 你可以通过编辑找到的那个来创建一个。您还可以使用OpenSAML创建断言
  3. 您没有在申请中签署回复,IDP会签署回复。签名验证取决于软件。 Here is how you do it in OpenSAML

答案 1 :(得分:4)

您还可以使用Java Saml from Onelogin使用其实用程序类(com.onelogin.saml2.util.Util)对响应进行签名:

// loads xml string into Document
Document document = Util.loadXML(saml);

// loads certificate and private key from string
X509Certificate cert = Util.loadCert(pubKeyBytes);
PrivateKey privateKey = Util.loadPrivateKey(privKeyBytes);

// signs the response
String signedResponse = Util.addSign(document, privateKey, cert, null);

您还可以使用另一个.addSign方法,该方法将Node作为第一个参数来签署SAML响应的声明。

他们的Maven依赖是:

<dependency>
    <groupId>com.onelogin</groupId>
    <artifactId>java-saml</artifactId>
    <version>2.0.0</version>
</dependency>