1

さまざまな理由 (好奇心、およびそれらを Web サービスに送信するテストが主な理由) で、SAML トークンをプログラムで取得しようとしていますが、Windows Azure ACS からトークンを取得するのに苦労しています。

Thinktecture の IdentityServer を使用して ID プロバイダーをセットアップし、以下のコードを使用してそこから SAML トークンを取得できます。

public static string GetSamlTokenForUsername(string issuerUrl,
       string username, string password)
    {
        var trustChannelFactory =
            new Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory(
                new Microsoft.IdentityModel.Protocols.WSTrust.Bindings.UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
                new EndpointAddress(new Uri(issuerUrl)));

        trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;
        trustChannelFactory.Credentials.UserName.UserName = username;
        trustChannelFactory.Credentials.UserName.Password = password;

        try
        {
            var tokenString = RequestToken(trustChannelFactory);
            trustChannelFactory.Close();

            return tokenString;
        }
        catch (Exception)
        {
            trustChannelFactory.Abort();
            throw;
        }
    }

    private static string RequestToken(Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory trustChannelFactory)
    {
        var rst =
            new RequestSecurityToken(Thinktecture.IdentityModel.Constants.WSTrust13Constants.RequestTypes.Issue,
               Thinktecture.IdentityModel.Constants.WSTrust13Constants.KeyTypes.Bearer);
        rst.AppliesTo = new EndpointAddress("https://localhost/");
        rst.TokenType = Microsoft.IdentityModel.Tokens.SecurityTokenTypes.Saml2TokenProfile11;

        var channel = (Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel)trustChannelFactory.CreateChannel();
        var token = channel.Issue(rst) as GenericXmlSecurityToken;
        var tokenString = token.TokenXml.OuterXml;

        return tokenString;
    }

ただし、ACS では、アプリケーションを RP としてセットアップし、2 つの ID プロバイダーを使用するように構成しました。そのうちの 1 つは Thinktecture IP です。

上記のコードを使用して Azure ACS からトークンを取得しようとすると、機能しなくなり、例外が返されます。これは、ACS の役割に対する私の理解が正しくないためだと思います。また、ACS は「フェデレーター」であるため、単純にトークンを要求することはできません。利用可能な ID プロバイダーを通知し、それらを見つけてトークンを取得するのに十分な情報を提供することになっていると思います。トークンを ACS に返す必要があります。

コードからこれを行うにはどうすればよいですか? これは WS-Trust ではなく WS-Federation ですか (用語はまだよくわかりません)。ID プロバイダーから SAML トークンを既に取得できると仮定すると、ACS にトークンを受け入れてフェデレーション トークンを提供するにはどうすればよいですか?

4

0 に答える 0