3

Microsoft Geneva Framework を使用したカスタム STS の実装に関する MSDN の記事 ( http://msdn.microsoft.com/en-us/magazine/2009.01.genevests.aspx ) を読んだ後、そこで取り上げられているシナリオの 1 つについて少し戸惑いました。 . このシナリオは、上記の参照記事の図 13 に示されています。

私の質問は、IP-STS から既に取得したクレームを渡すために、RP が RP-STS への呼び出しを開始する方法についてです。目的のメソッド DeleteOrder() は、RP-STS からの Action クレームの Claim Request にどのように変換されますか? RP-STS は、呼び出しを承認する値 Delete を持つ Action クレームで応答しますか? また、RP-STS とポリシー エンジンの間の相互作用では、クレームと矢印が逆になるはずであるという点で、この図は少し間違っていると思います。

構造はわかりますが、Geneva/WCF によって提供されているものと、RP 内のコードで何を実行する必要があるかが明確ではありません。これは、削除の PrincipalPermission 要求で DeleteOrder メソッドを保護できなかったため、少し奇妙に思えます。許可」ですが、最初に役割を要求し、その後、削除アクションのきめ細かい要求を取得する必要があります。

要点を見逃していた場合は (Web 上でこのケースを簡単にカバーすることができないため)、申し訳ありません。

前もって感謝します。

4

2 に答える 2

1

http://social.msdn.microsoft.com/Forums/en/Geneva/thread/d10c556c-1ec5-409d-8c25-bee2933e85ea?prof=requiredのジュネーブ フォーラムで同じ質問をしたところ、次のような 回答がありました。

こんにちは。

その記事を読んだとき、私はこれと同じことを疑問に思いました。このようなシナリオをどのように実装するかを考えた結果、次の 2 つのアイデアが思い浮かびました。

  1. RP は実際には、RP-STS からの要求を要求するように構成されています。RP-STS には、IP-STS からのセキュリティ トークンが必要です。その結果、サブジェクトが RP のリソースを要求すると、サブジェクトは RP-STS にバウンスし、RP-STS は彼を IP-STS にバウンスします。そこで認証された後、彼は RP-STS に戻されます。ID 中心のクレームは、承認の決定を行うために必要なものに変換され、RP に返されます。

  2. RP は、呼び出しを取得し、ID 中心の要求を確認し、(WSTrustClient を使用して) RST を作成し、それを RP-STS に渡すインターセプター (WCF サービスの場合は AuthorizationPolicy など) を持つように構成されています。 RP に返されるクレームを新しいクレームに展開し、RP は承認の決定を行います。

私はこれを実装したことはありませんが、実装する場合は、これら 2 つのアイデアをさらに検討します。

チッ!


よろしく、

トラヴィス・スペンサー

したがって、最初にオプション 2 を試して、それがうまくいくかどうかを確認してから、ここで回答を作成します。

于 2009-05-09T16:36:46.437 に答える
0

状況 1 は問題なく動作しています。私の場合、AD FS は Identity Service であり、カスタム STS は Resource STS です。

すべての webapp は同じリソース STS を使用しますが、ユーザーが他のアプリケーションにアクセスした後、ユーザーは既に認証されているため、ID 関連のクレームが AD FS によって再度追加されることはありません。AD FS からの基本的な要求を強制または要求するにはどうすればよいですか?

ActAs を使用して AD FS への呼び出しを作成したところ、ID クレームが返されるようになりました。AD FS の呼び出しに使用される資格情報に対して、委任を許可する規則を有効にすることを忘れないでください。

string stsEndpoint = "https://<ADFS>/adfs/services/trust/2005/usernamemixed";
     var trustChannelFactory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), stsEndpoint);

     trustChannelFactory.Credentials.UserName.UserName = @"DELEGATE";
     trustChannelFactory.Credentials.UserName.Password = @"PASSWORD";

     trustChannelFactory.TrustVersion = TrustVersion.WSTrustFeb2005;

     //// Prepare the RST.
     //var trustChannelFactory = new WSTrustChannelFactory(tokenParameters.IssuerBinding, tokenParameters.IssuerAddress);
     var trustChannel = (WSTrustChannel)trustChannelFactory.CreateChannel();

     var rst = new RequestSecurityToken(RequestTypes.Issue);

     rst.AppliesTo = new EndpointAddress(@"https:<RPADDRESS>");

     // If you're doing delegation, set the ActAs value.
     var principal = Thread.CurrentPrincipal as IClaimsPrincipal;
     var bootstrapToken = principal.Identities[0].BootstrapToken;

     // The bootstraptoken is the token received from the AD FS after succesfull authentication, this can be reused to call the AD FS the the users credentials
     if (bootstrapToken == null)
     {
        throw new Exception("Bootstraptoken is empty, make sure SaveBootstrapTokens = true at the RP");
     }

     rst.ActAs = new SecurityTokenElement(bootstrapToken);

     // Beware, this mode make's sure that there is no certficiate needed for the RP -> AD FS communication
     rst.KeyType = KeyTypes.Bearer;

     // Disable the need for AD FS to crypt the data to R-STS
     Scope.SymmetricKeyEncryptionRequired = false;

     // Here's where you can look up claims requirements dynamically.
     rst.Claims.Add(new RequestClaim(ClaimTypes.Name));
     rst.Claims.Add(new RequestClaim(ClaimTypes.PrimarySid));

     // Get the token and attach it to the channel before making a request.
     RequestSecurityTokenResponse rstr = null;
     var issuedToken = trustChannel.Issue(rst, out rstr);
     var claims = GetClaimsFromToken((GenericXmlSecurityToken)issuedToken);

 private static ClaimCollection GetClaimsFromToken(GenericXmlSecurityToken genericToken)
  {
     var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;
     var token = handlers.ReadToken(new XmlTextReader(new StringReader(genericToken.TokenXml.OuterXml)));
     return handlers.ValidateToken(token).First().Claims;
  }
于 2011-05-11T11:46:44.620 に答える