1

SAML 2.0 認証シナリオを有効にするために、.NET を使用して WS Trust 1.4 サービスにクエリを実行する必要があります。

編集: より正確に言うと、WS Trust 1.4 で定義されているクライアント側でユーザー インタラクション チャレンジをサポートする必要があります。

WSTrustChannelFactory を介して WS Trust への直接アクセスを提供する WIF を調べました (codesnippet の trustChannelFactory.TrustVersion を参照してください...) が、WS-Trust 1.3 と Feb2005 しかサポートしていないようです。

            WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory(getBinding(), "http:/localhost...");

            trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;
            WSTrustChannel channel = (WSTrustChannel)trustChannelFactory.CreateChannel();

            RequestSecurityToken rst = new RequestSecurityToken();

            RequestSecurityTokenResponse rstr = null;
            SecurityToken token = channel.Issue(rst, out rstr);

.NET を使用してこのような直接的な WS-Trust クエリを実装する方法を知っている人はいますか?

SAML 2.0 を使用する必要があり、SAMl 2.0 認証要求を IdP に渡す前にアプリケーション サーバーから取得する必要があるため、WSHttpFederation バインディングを使用できません。

もちろん、独自のクライアント側 WS-Trust 1.4 を展開することもできます。実装ですが、おそらくもっと簡単な方法があります...

4

1 に答える 1

2

.NET 拡張メソッドを使用して、WIF WS Trust の実装を拡張しました。ここでは、WIF で既に定義されているものを再利用する方法の例として、最初の部分 (RST および SAML Authn 要求を使用した要求の発行) を確認できます。IL 逆アセンブラーを使用して、WIF 内でどのように処理されているかを確認しましたが、これは途中で非常に役立ちました...

internal static RequestSecurityTokenResponseWithSAML2Assertion Issue(this WSTrustChannel pThis,
        string pSAML2AuthnRequest,
        Func<ProfileSelectionChallengeType, wsTrust14.ChoiceSelectedType> pProfileSelectionCallback)
    {
        if (pThis != null)
        {
            if (pThis.ChannelFactory != null &&
                pThis.ChannelFactory.Endpoint != null &&
                pThis.ChannelFactory.Endpoint.Binding != null)
            {
                // Create RST Request
                RequestSecurityToken rst = new RequestSecurityToken("http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue");
                rst.TokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0";

                // we use WS Trust 1.4 but .NET WIF only provides support for WS Trust 1.3
                // so we add the needed Challenge support and reuse most of the WIF stuff
                if (pThis.TrustVersion != System.ServiceModel.Security.TrustVersion.WSTrust13)
                {
                    throw new Exception("Given WS Trust Version not supported!");
                }

                // create a WS Trust 1.3 SOAP Message
                Message issueRequest = Message.CreateMessage(pThis.ChannelFactory.Endpoint.Binding.MessageVersion,
                    "http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue",
                    new WSTrustRequestBodyWriter(rst,
                        pThis.WSTrustRequestSerializer,
                        pThis.WSTrustSerializationContext));

                // add SAML Authn Request to the WS Trust request
                XmlDocument messageAsXml = issueRequest.serializeToXml();
                messageAsXml = SAMLSupport.addSAMLAuthenticationRequest(messageAsXml, pSAML2AuthnRequest);
                issueRequest = issueRequest.generateFromXml(messageAsXml);

                // invoke the WS Trust service on the STS
                Message responseMessage = pThis.Issue(issueRequest);

                // check what we received as answer...
                var response = pThis.parseAndHandleResponse(responseMessage, pProfileSelectionCallback);
                return response;
            }
        }
于 2012-05-29T11:33:18.953 に答える