8

ADFS とクレームで動作するシステムを構築しようとしています。現時点では、これは単なる「おもちゃ」の実装です。

非常に単純な MVC Web アプリケーションを構築し、Visual Studio の「ID とアクセス...」ウィザードを使用して ADFS 2.0 サーバーと通信するようにセットアップし、IIS サーバーに展開しました。すべて正常に動作し、受け取ったクレームを調べて一覧表示できます。

次のステップは、Web API ベースの REST サービス (MVC アプリケーションが依存するバックエンド サービスを表す) を構築することです。そのため、資格情報をそのバックエンド サーバーに渡して、適切な承認を行うことができるようにします。決定。

HttpClientしたがって、最初のステップは、委任トークンを作成することです (そして、残りの呼び出しを行うクラスに関して、委任トークンをどうするかを考えます)。私はこれを持っています:

//We need to take the bootstrap token and create an appropriate ActAs token
var rst = new RequestSecurityToken
{
    AppliesTo = new EndpointReference("https://other-iis.example.com/Rest"),
    RequestType = RequestTypes.Issue,
    KeyType = KeyTypes.Symmetric,
    ActAs = new SecurityTokenElement(((BootstrapContext)((ClaimsIdentity)User.Identity).BootstrapContext).SecurityToken)
};

var sts = new SecurityTokenService(); //This line isn't valid
var resp = sts.Issue(System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal, rst);

しかし、問題はそれSecurityTokenServiceが抽象的であることです。System.IdentityModelどちらにもこのクラスから派生した型が見つかりませSystem.IdentityModel.Servicesん。上記には、ある時点で提供する必要があることは明らかな ADFS サーバーへの参照が含まれていません。

もちろん、私も完全に間違ったルートを下っている可能性があります。あるいは、小さなつまずきにぶつかっただけで、はるかに大きなつまずきが遠くに迫っているのが見えないので、それに関するアドバイスもいただければ幸いです.


たとえば、Identity Delegation Scenarioを見てきましたが、それは を使用しておりCreateChannelActingAs、休憩サービスと話しているときにうまくいくとは思いません (またはそうなるでしょうか?)。 .NET 4.5 に適用されます。

4

3 に答える 3

3

DisplayTokenをキャッシュして確認するために、ADFS2.0にトークンを要求しています。多分これはあなたが始めるのを助けることができます。

これが私ができることです:

    public SecurityToken GetToken(out RequestSecurityTokenResponse rstr)
    {
        Console.WriteLine("Connecting to STS...");

        WSTrustChannelFactory factory = null;

        try
        {
            if (_useCredentials)
            {
                // use a UserName Trust Binding for username authentication
                factory =
                    new WSTrustChannelFactory(
                        new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
                        "https://<adfs>/adfs/services/trust/13/UsernameMixed");

                factory.TrustVersion = TrustVersion.WSTrust13;

                // Username and Password here...
                factory.Credentials.UserName.UserName = "username";
                factory.Credentials.UserName.Password = "password";
            }
            else
            {
                // Windows authentication over transport security
                factory = new WSTrustChannelFactory(
                    new WindowsWSTrustBinding(SecurityMode.Transport),
                    "https://<adfs>/adfs/services/trust/13/windowstransport") { TrustVersion = TrustVersion.WSTrust13 };
            }

            var rst = new RequestSecurityToken
                          {
                              RequestType = RequestTypes.Issue,
                              AppliesTo = SvcEndpoint,
                              KeyType = KeyTypes.Symmetric,
                              RequestDisplayToken = true
                          };

            Console.WriteLine("Creating channel for STS...");

            IWSTrustChannelContract channel = factory.CreateChannel();

             Console.WriteLine("Requesting token from " + StsEndpoint.Uri);
             SecurityToken token = channel.Issue(rst, out rstr);
             Console.WriteLine("Received token from " + StsEndpoint.Uri);

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

使用する場合は、ADFS 2.0でUsernameMixedエンドポイントをアクティブ化する必要があり、後でサービスを再起動することを忘れないでください。

于 2012-06-06T13:32:43.613 に答える
1

msdnから

STS を作成するには、SecurityTokenService クラスから派生する必要があります。カスタム クラスでは、少なくとも GetScope メソッドと GetOutputClaimsIdentity メソッドをオーバーライドする必要があります。

于 2012-06-05T16:39:09.020 に答える
1

これがどれだけ役立つかはわかりませんが、SecurityTokenService を作成することは想定されていません。ここで新しいトークンを作成するのではなく、アプリケーションが STS として機能することは想定されていません。これが AD FS の目的です。
アプリケーションは、AD FS から受信したトークンのみをサービスに委任する必要があります (概念は、質問で提供した msdn からのリンクで説明されています)。

wcfに基づいて構築されているため、Web APIもこれをサポートする可能性が高いと思います.httpの観点からは、ws-federation/saml 2トークンをサポートしない理由はありません.

編集:
このビデオ (35:00+- から開始) は、ws-federation saml トークンを使用して、探しているものを実装する方法を示していると思います。saml2トークンでも可能だと思います

于 2012-06-05T17:02:20.800 に答える