0

トークン ベースの WS-Trust Web サービスを機能させるために文字通り太陽の下であらゆることを試みましたが、役に立ちませんでした。STS からトークンを取得することはできますが、トークンを使用して WS サーバーを安全にし、外部からアクセスできるようにする方法がわかりません。

だから私が知りたいのは、誰かがこれをJBoss 7で動作させたことがあるかどうかということです。「jbossのこれとあれがあなたにいくつかの情報を与えるはずだ」には興味がありません。そこに行ったことがあります-機能しません。あなたはそれを機能させることができましたか?

4

1 に答える 1

0

SAML を使用して Web サービスを保護するために picketlink を調べましたが、JAAS セキュリティ コンテキストを使用して SAML 認証を公開しているようです。その代わりに、ピケットリンク API を使用して WS を保護するカスタム ハンドラーを作成しました。ハンドラーは基本的に、picketlink jar で使用可能な SAMLTokenCertValidatingCommonLoginModule と同じこと (つまり、saml アサーションの有効期限とデジタル署名の検証チェック) を行いますが、SAML 属性を JAAS セキュリティ コンテキストとして渡すのではなく、WS メッセージ コンテキストに渡します。

コード スニペットの下を見つけます。

カスタムハンドラーで使用されるメソッド getX509Certificate、validateCertPath の実装については、 picketlink-jbas-common ソースの org.picketlink.identity.federation.bindings.jboss.auth.SAMLTokenCertValidatingCommonLoginModule クラスを参照してください。

public class CustomSAML2Handler<C extends LogicalMessageContext> implements SOAPHandler {

protected boolean handleInbound(MessageContext msgContext) {
    logger.info("Handling Inbound Message");

    String assertionNS = JBossSAMLURIConstants.ASSERTION_NSURI.get();
    SOAPMessageContext ctx = (SOAPMessageContext) msgContext;


    SOAPMessage soapMessage = ctx.getMessage();

    if (soapMessage == null)
        throw logger.nullValueError("SOAP Message");

    // retrieve the assertion
    Document document = soapMessage.getSOAPPart();
    Element soapHeader = Util.findOrCreateSoapHeader(document.getDocumentElement());
    Element assertion = Util.findElement(soapHeader, new QName(assertionNS, "Assertion"));
    if (assertion != null) {
        AssertionType assertionType = null;
        try {
            assertionType = SAMLUtil.fromElement(assertion);
            if (AssertionUtil.hasExpired(assertionType))
                throw new RuntimeException(logger.samlAssertionExpiredError());
        } catch (Exception e) {
            logger.samlAssertionPasingFailed(e);
        }
        SamlCredential credential = new SamlCredential(assertion);
        if (logger.isTraceEnabled()) {
            logger.trace("Assertion included in SOAP payload: " + credential.getAssertionAsString());
        }

        try {
            validateSAMLCredential(credential, assertionType);
            ctx.put("roles",AssertionUtil.getRoles(assertionType, null));
            ctx.setScope("roles", MessageContext.Scope.APPLICATION);

        } catch (Exception e) {
            logger.error("Error: " + e);
            throw new RuntimeException(e);
        }
    } else {
        logger.trace("We did not find any assertion");
    }


    return true;
}

private void validateSAMLCredential(SamlCredential credential, AssertionType assertion) throws LoginException, ConfigurationException, CertificateExpiredException, CertificateNotYetValidException {


    // initialize xmlsec
    org.apache.xml.security.Init.init();

    X509Certificate cert = getX509Certificate(credential);

    // public certificate validation
    validateCertPath(cert);

    // check time validity of the certificate
    cert.checkValidity();

    boolean sigValid = false;
    try {
        sigValid = AssertionUtil.isSignatureValid(credential.getAssertionAsElement(), cert.getPublicKey());
    } catch (ProcessingException e) {
        logger.processingError(e);
    }
    if (!sigValid) {
        throw logger.authSAMLInvalidSignatureError();
    }
    if (AssertionUtil.hasExpired(assertion)) {
        throw logger.authSAMLAssertionExpiredError();
    }

}

}

于 2012-12-27T21:06:02.480 に答える