4

私はWCF Webサービスを開発して、ユーザーのログインアクションとアクティブディレクトリの役割と権限の間の仲介者を作成しています。ホスト アプリケーションが AD FS と直接通信することは望ましくありません。どのホスト アプリケーションでも自分の Web サービスを使用できるようにしたいのですが、指定された資格情報に基づいて必要な情報が提供されます。

私の Web メソッドでは、ユーザーのログイン資格情報によって AD FS (WIF) から要求を取得する必要があります。

私の Web メソッドには、ウィンドウ ユーザーの電子メール ID/Windows アカウント名とパスワードの 2 つの入力パラメーターがあります。

したがって、特定のユーザーの資格情報を使用して、Web メソッドで AD FS クレームにアクセスしたいと考えています。

特定のユーザーの資格情報で AD FS 要求を取得するにはどうすればよいですか?

4

2 に答える 2

7

統合 Windows 認証を使用する AD FS 2.0 の https://.../adfs/services/trust/13/usernamemixed エンドポイントに対して Web サービス呼び出しを実行し、接続をセットアップできるようにユーザーの資格情報を提供する必要があります。このエンドポイントで、http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issueオペレーションを呼び出します。(詳細は、WS-Trust 1.3 仕様のセクション 4.1 にあります。) この操作の入力は、RequestSecurityToken 要求です。応答には、必要なクレームを含む SAML トークンが含まれています。

AD FS 2.0 WSDL は https://.../adfs/services/trust/mex で利用できることに注意してください。Visual Studio のサービス参照の追加ウィザードまたは Java wsimportをその URL にポイントすると、簡単にRST 発行操作の実行に使用できるクライアント コードを生成します。

于 2012-06-11T19:35:07.253 に答える
5

ADFS から DisplayTokem を要求して、それを操作することができます。これは基本的に、トークンに含まれている情報と同じです。

public DisplayClaimCollection GetDisplayClaims(string username, string password)
        {
            WSTrustChannelFactory factory = null;
            try
            {

                // use a UserName Trust Binding for username authentication
                factory = new WSTrustChannelFactory(
                    new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
                    "https://.../adfs/services/trust/13/usernamemixed");

                factory.TrustVersion = TrustVersion.WSTrust13;


                factory.Credentials.UserName.UserName = username;
                factory.Credentials.UserName.Password = password;


                var rst = new RequestSecurityToken
                              {
                                  RequestType = RequestTypes.Issue,
                                  AppliesTo = "Relying party endpoint address",
                                  KeyType = KeyTypes.Symmetric,
                                  RequestDisplayToken = true
                              };

                IWSTrustChannelContract channel = factory.CreateChannel();
                RequestSecurityTokenResponse rstr;
                SecurityToken token = channel.Issue(rst, out rstr);

                return rstr.RequestedDisplayToken.DisplayClaims;
            }
            finally
            {
                if (factory != null)
                {
                    try
                    {
                        factory.Close();
                    }
                    catch (CommunicationObjectFaultedException)
                    {
                        factory.Abort();
                    }
                }
            }
        }

しかし、これは適切な方法ではありません。RelyingParty 証明書を使用して、暗号化されたトークンを復号化し、そこからクレームを読み取る必要があります。

于 2012-06-12T07:47:31.737 に答える