如何使用OpenSAML将用户发送到SAML登录页面?

问题描述 投票:1回答:1

我有一个已经有登录系统和用户对象等的应用程序。我想调整它,以便它可以使用SAML身份提供程序进行身份验证。

为此,我需要构建一个页面,将用户发送到身份提供者进行登录。这是我到目前为止测试的内容:

public String getSamlLoginPage() throws IOException, ConfigurationException {
    DefaultBootstrap.bootstrap();

    AuthnRequest authnRequest = buildSamlObject(AuthnRequest.DEFAULT_ELEMENT_NAME,AuthnRequestBuilder.class);

    String myResponseUrl = "http://localhost:8080/samltest/saml?action=samlLogin";
    String serviceProviderEntityId = "someProviderEntityId";


    // set information in request
    {
        authnRequest.setForceAuthn(false);
        authnRequest.setIsPassive(false);
        authnRequest.setIssueInstant(new DateTime());
        authnRequest.setDestination(myResponseUrl);
        authnRequest.setProtocolBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);
        authnRequest.setAssertionConsumerServiceURL(myResponseUrl);
        authnRequest.setID(""+UUID.randomUUID().getLeastSignificantBits());

        Issuer issuer = buildSamlObject(Issuer.DEFAULT_ELEMENT_NAME, IssuerBuilder.class);
        issuer.setValue(serviceProviderEntityId);
        authnRequest.setIssuer(issuer);

        NameIDPolicy nameIDPolicy = buildSamlObject(NameIDPolicy.DEFAULT_ELEMENT_NAME, NameIDPolicyBuilder.class);
        nameIDPolicy.setSPNameQualifier(serviceProviderEntityId);
        nameIDPolicy.setAllowCreate(true);
        nameIDPolicy.setFormat("urn:oasis:names:tc:SAML:2.0:nameid-format:transient");
        authnRequest.setNameIDPolicy(nameIDPolicy);

        RequestedAuthnContext requestedAuthnContext = buildSamlObject(RequestedAuthnContext.DEFAULT_ELEMENT_NAME,RequestedAuthnContextBuilder.class);
        requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.MINIMUM);

        AuthnContextClassRef authnContextClassRef = buildSamlObject(AuthnContextClassRef.DEFAULT_ELEMENT_NAME,AuthnContextClassRefBuilder.class);
        authnContextClassRef.setAuthnContextClassRef("urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport");

        requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef);
        authnRequest.setRequestedAuthnContext(requestedAuthnContext);
    }



    String samlRequestStr = XMLUtil.doc2String( authnRequest.getDOM() );
    byte[] samlRequest = samlRequestStr.getBytes();  // <samlp:AuthnRequest>

    ByteArrayOutputStream bout = new ByteArrayOutputStream(500);
    Base64.encode(samlRequest,bout);

    return
        "<html><body>"
        +"<form method=\"post\" action=\"https://idp.example.org/SAML2/SSO/POST\">"
            +"  <input type=\"hidden\" name=\"SAMLRequest\" value=\""+ bout.toString() +"\" />"
//                +"  <input type=\"hidden\" name=\"RelayState\" value=\"someToken\" />"
            +"  <input type=\"submit\" value=\"Submit\" />"
            +" </form>"
        +"<body></html>";
}

private <SAMLObjectType extends SAMLObject, BuilderT extends SAMLObjectBuilder<SAMLObjectType>> SAMLObjectType buildSamlObject(javax.xml.namespace.QName defaultElementName, Class<BuilderT> type) {
    XMLObjectBuilderFactory builderFactory = org.opensaml.Configuration.getBuilderFactory();
    BuilderT requestBuilder = (BuilderT)builderFactory.getBuilder(defaultElementName);
    return requestBuilder.buildObject();
}

我需要将操作更改为指向实际的身份提供者。除此之外,我应该把什么放入Request对象?我需要的只是身份提供者验证用户是真实用户(他们将通过身份提供商的电子邮件和密码登录),然后告诉我他们的电子邮件地址是什么以及我可以使用的某种签名验证以证明用户已经过身份提供者验证。

关于用户的所有其他信息都存储在本地,因此我需要电子邮件和idp签名。

java authentication saml opensaml
1个回答
0
投票

saml请求必须包含一些内容。它通常也必须签名。 Here是我写的关于如何使用OpenSAML创建Authn SAML请求的博客文章

我还有一本书A Guide to OpenSAML,它很好地介绍了SAML和OpenSAML库。

© www.soinside.com 2019 - 2024. All rights reserved.