3

私は持っている:

  • ID プロバイダーでもあるパッシブ STS "ログイン アプリケーション"。
  • ActAs トークンを受け入れて処理できるアクティブな STS WCF サービス
  • Web サイトの証明書利用者
  • Web サイトによって呼び出される WCF サービス証明書利用者。

これらはすべて、Windows Identity Foundation とカスタム STS コードを使用してまとめられています。Active Directory (ADFS) は関係ありません。

私が今働いているのは:

  1. ユーザーが Web サイト RP にアクセスしようとします。
  2. ユーザーがパッシブ STS にリダイレクトされます。
  3. ユーザーがログインし、発行されたトークンを取得し、Web サイト RP にリダイレクトされます。
  4. Web サイト RP は WCF RP へのサービス呼び出しを行い、ActAs トークンを渡すことで委任が発生します。
  5. アクティブな STS は、ActAs トークンが入ってくるのを確認し、出力 ID を適切に設定して、プライマリ ID が ActAs トークンになり、呼び出し元の ID がアクター チェーンに追加されるようにします。
  6. WCF RP は適切なトークンをすべて取得し、現在のスレッド プリンシパルは適切な ID とクレームを適切に取得します。

WCF RP がアクティブな STS から追加の要求を要求するようにします。

つまり、アクティブな STS に送られる RST に、サービスが必要とするクレームのリストを含めて、それらの追加のクレームがまだ存在しない場合にフェッチできるようにしたいと考えています。

Web サイト RP クライアントのバインディングを変更することでこれを行う方法を見つけましたが、WCF RP サービス エンドで要件を指定したいと考えています。

私が使用しているバインディングと関係があると感じています。ws2007FederationHttpBinding を ActAs トークンで動作させるのに問題があり、WIF ID トレーニング キットのすべての例で customBinding が使用されていたので、それも行いましたが、最終的には動作しました。これは、私のバインド構成を示す WCF RP の構成スニペットです。

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_FederatedService">
        <security
          authenticationMode="IssuedTokenForCertificate"
          messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10">
          <issuedTokenParameters tokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
            <issuer address="http://localhost:38901/ActiveSts.svc/IWSTrust13" />
            <issuerMetadata address="http://localhost:38901/ActiveSts.svc/mex" />
          </issuedTokenParameters>
        </security>
        <textMessageEncoding>
          <readerQuotas maxArrayLength="32767" />
        </textMessageEncoding>
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>
</system.serviceModel>

呼び出し元の Web サイトの構成を変更して、issuedTokenParameters セクションで claimTypeRequirements を示すようにすると、アクティブ STS は実際には RST で必要な要求のリストを確認します... しかし、それは呼び出し元の Web サイトにあり、これは私にとって問題です。

呼び出し元の Web サイトでその構成を複製することなく、WCF RP が必要な追加のクレームを指定できるようにするにはどうすればよいですか?

それが実際に拘束力のある問題である場合は、上記の内容と同等の構成を示していただければ助かります。適切な変更を加えて Web サイトと WCF サービスを更新できますが、必要な要求のリストを制御するには、サービス (ま​​たはサービスの動作、またはサービスの構成) が必要です。サービスは、必要なクレームが欠落しているリクエストを受け入れるべきではありません。

4

1 に答える 1

4

あなたがこれをしなければならない方法は...

  1. クライアント側でクレーム要件を取得する方法を見つけます。これは、ある種の中央構成サービス、WS-Policy /メタデータ交換、または任意のものである可能性があります。
  2. STSのトークンリクエストを手動で作成します。Microsoft.IdentityModel拡張メソッドを使用するのではなく、を使用してCreateChannelActingAs(token)ActAsトークン(または新しいトークン)を手動で要求しますWSTrustChannelFactory
  3. 手動で要求されたトークンを発信チャネルパラメータに追加します。

これにより、クライアントがクレーム要件のリストについて知る必要が完全になくなるわけではありませんが、何らかの方法でその構成を一元化したり、サービス自体を使用してクレーム要件のリストを提供したりすることができます。残念ながら、Microsoft.IdentityModelスタックには、これをすべて行うものはありません。セキュリティトークンの要求はクライアント通信の一部として発行され、サービス操作要求が着信したときにサービスによって発行されるのではないため、クライアントはクレーム要件のリストを絶対に知る必要があります。

とにかく、 MSDNWebサイトWSTrustChannelFactoryでいくつかのまともな説明を見ることができます。私の解決策はそれに基づいています。WSTrustChannel

すべてのエラー処理などを行わずに煮詰めると、コードは基本的に次のようになります。

// You need the channel factory so you can get info about the endpoint.
var factory = new ChannelFactory<IService>();

// Get the issuedTokenParameters information from the binding.
// You see this in the XML config but it's painful to access.
var tokenParameters = factory.Endpoint.Binding
    .CreateBindingElements()
    .OfType<SecurityBindingElement>().First()
    .EndpointSupportingTokenParameters
    .Endorsing.OfType<IssuedSecurityTokenParameters>().First();

// Prepare the RST.
var trustChannelFactory = new WSTrustChannelFactory(tokenParameters.IssuerBinding, tokenParameters.IssuerAddress);
var trustChannel = (WSTrustChannel)trustChannelFactory.CreateChannel();
var rst = new RequestSecurityToken(RequestTypes.Issue);
rst.AppliesTo = factory.Endpoint.Address;

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

// Here's where you can look up claims requirements dynamically.
rst.Claims.Add(new RequestClaim("http://dynamically-added-claim"));

// Get the token and attach it to the channel before making a request.
RequestSecurityTokenResponse rstr = null;
var issuedToken = trustChannel.Issue(rst, out rstr);
var fccParameters = new FederatedClientCredentialsParameters();
fccParameters.IssuedSecurityToken = issuedToken;
var channel = factory.CreateChannel();
((IChannel)channel).GetProperty<ChannelParameterCollection>().Add(fccParameters);

// NOW you can make the request.
channel.DoWork();

これにより、システム内を流れる通信の一部を最適化する場合に、発行されたトークンをキャッシュすることもできます。

確かに、クレーム要件を動的に挿入しようとしていない場合、またはXML構成を使用してサーバーとクライアントに複製することに満足している場合は、これは必要ありません。拡張メソッドとMicrosoft.IdentityModelスタック全体がこれCreateChannelActingAs(token)を処理します。

于 2010-08-30T20:26:26.450 に答える