3

クレームがローカルデスクトップアプリでどのように使用されているかを理解するのに役立つことを本当に感謝します。シナリオは次のとおりです。ユーザーが「AnalysisAllowed:true」のようなクレームを持っているかどうかに応じて、タブfeを表示したいと思います。そのため、アプリの起動時にクレームを取得し、後でそれらに対してバインドしたいと思います。

すべてのサンプルは、WCFがAuthorization-およびAuthenticationManagersを使用して他のWCF-Servicesへのクレームベースの呼び出しを行う方法について話しているが、stsに連絡して(どうすればよいですか?WCF-Fed Binding?)、キャッシュするよりもそれを使用するもの。他のサービスコールはありません...:)

どうもありがとう!

4

2 に答える 2

2

デフォルト構成(クライアントとSTS)では、取得するトークンは暗号化されます(署名は別として)。すべて(クライアントとサービス)を所有している場合は、いくつかのノブを微調整して、トークンがクライアントから「読み取り可能」になるようにすることができます(したがって、暗号化されません)。

ここに、ADFSから暗号化されていないSAMLトークンを提供するコードがあります(重要なのは、「ベアラー」トークンを要求し、暗号化証明書なしでADFS証明書利用者を構成することです)。

private static SecurityToken GetSamlToken(string realm, string stsEndpoint, ClientCredentials clientCredentials)
{
    using (var factory = new WSTrustChannelFactory(
        new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
        new EndpointAddress(new Uri(stsEndpoint))))
    {
        factory.Credentials.UserName.UserName = clientCredentials.UserName.UserName;
        factory.Credentials.UserName.Password = clientCredentials.UserName.Password;
        factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
        factory.TrustVersion = TrustVersion.WSTrust13;

        WSTrustChannel channel = null;

        try
        {
            var rst = new RequestSecurityToken
                          {
                              RequestType = WSTrust13Constants.RequestTypes.Issue, 
                              AppliesTo = new EndpointAddress(realm), 
                              KeyType = KeyTypes.Bearer, 
                          };

            channel = (WSTrustChannel)factory.CreateChannel();

            return channel.Issue(rst);
        }
        finally
        {
            if (channel != null)
            {
                channel.Abort();
            }

            factory.Abort();
        }
    } 

トークンを取得したら、LINQ to XMLまたはWIFを使用して、SecurityTokenからClaimsIdentityを取得できます。クライアントとSTSおよびサービスの間でSSLを使用していることを確認してください。

あなたが持っている2番目のオプションは、クレームのリストを返すためにサービスに依存することです。これはもう1つのリクエストですが、ユーザーがログインすると同時にそれを実行し、トークンの有効期限が切れるまでそれらのクレームをキャッシュします。

public IEnumerable<Claim> GetUserClaims() {
      // get Thread.CurrentPricinpal IClaimsIdentity and grab the claims
}
于 2012-07-16T13:08:53.857 に答える
0

使用しているSTSはわかりませんが、通常(たとえば、AD FS 2.0を使用して)、WS-Trustを使用してSTSWebサービスに接続します。これは、アクティブフェデレーションとパッシブフェデレーションです。

これを行う方法のサンプルについては、こちらのラボ4をご覧ください。

于 2012-07-16T12:19:44.893 に答える