ASP.Net WCF サービスの Thread.CurrentPrincipal が、フェデレーション (WIF) 環境の一部のインターセプターによって破棄されます

StackOverflow https://stackoverflow.com/questions/1932424

  •  20-09-2019
  •  | 
  •  

質問

IIS (.svc) でホストされている呼び出しごとの WCF サービスがあります。サービスのコンストラクターで、次のように設定しました Thread.CurrentPrincipal = HttpContext.Current.User に従って この記事. 。この場合 HttpContext.Current.User タイプです Microsoft.IdentityModel.Claims.ClaimsPrincipal カスタム パッシブ STS から返送されたクレームが含まれています。

しかし、サービス業務に足​​を踏み入れて調査するとすぐに、 スレッド.CurrentPrincipal, 、このオブジェクトはまだタイプのままです Microsoft.IdentityModel.Claims.ClaimsIdentity, 、オブジェクト自体はもはや同じではありません HttpContext.Current.User (Thread.CurrentPrincipal.Identity では、IsAuthenticated = false、AuthenticationType = ""、および Name が null です)、これらの値はすべて依然として正しく入力されています。 HttpContext.Current.User. 。これは、何かが操作への呼び出しをインターセプトし、現在のプリンシパルを汎用の空の認証されていないクレーム プリンシパルに誤って変更していることを示しています。

コンストラクターと操作でスレッド ID を確認しましたが、両方の場所で同じであり、評価しました スレッド.CurrentPrincipal から割り当てた直後のウィンドウで HttpContext.Current.User スレッド ID がコンストラクター内で正しく設定されているため、コンストラクターとメソッドの間で何かが間違いなく実行されており、何かが変更されていることがわかります。 スレッド.CurrentPrincipal.

何がこれをやっているのか、またこの動作を防ぐ/修正するにはどうすればよいのかわかる人はいますか?

役に立ちましたか?

解決 2

WIF フェデレーション用のサービスを構成する場合、次のように呼び出します。

FederatedServiceCredentials.ConfigureServiceHost(this);

この呼び出しの内容の一部は、カスタムのセットアップです。 サービス認可マネージャー タイプの IdentityModelServiceAuthorizationManager サービスホスト上で。この認可マネージャーは、インスタンスのアクティブ化 (構築) とオペレーションの実行の間に呼び出され、上書きされるようです。 スレッド.CurrentPrincipal のインスタンスを使用して Iクレームプリンシパル, 、しかし、ASP.NET互換モードで実行されていることを認識していないようなので、プリンシパルをプルしません HttpContext.Current.User.

以下から派生することでこの動作を回避できました IdentityModelServiceAuthorizationManager そしてオーバーライド チェックアクセス 次のような方法:

public class CustomAuthorizationManager : IdentityModelServiceAuthorizationManager
{
    public override bool CheckAccess(System.ServiceModel.OperationContext operationContext, ref System.ServiceModel.Channels.Message message)
    {
        var result = base.CheckAccess(operationContext, ref message);

        var properties = operationContext.ServiceSecurityContext.AuthorizationContext.Properties;
        properties["Principal"] = System.Web.HttpContext.Current.User;

        return result;
    }
}

これは、次のようにサービス ホストに適用されます。

protected override void InitializeRuntime()
{
    FederatedServiceCredentials.ConfigureServiceHost(this);
    this.Authorization.ServiceAuthorizationManager = new CustomAuthorizationManager();
    base.InitializeRuntime();
}

そして今、私がサービス業務に入るとき、正しい情報を持っています。 Iクレームプリンシパル の上 スレッド.CurrentPrincipal, 、とても宣言的です 本人の許可 期待どおりに動作するようになりました。

他のヒント

私は同様の問題に遭遇しました。私は私のWCFサービスのコンストラクタで私のカスタムプリンシパルを設定します。私は、コンストラクタを残した、と私はと呼ばれるメソッドに入ったとき、のThread.CurrentPrincipalは、空のいずれかによってオーバーライドされました。私は次のような動作を追加することでこれを解決します:

<serviceAuthorization principalPermissionMode="None"></serviceAuthorization>

これは私のためにうまく働いています。

コールのための

confguration設定の FederatedServiceCredentials.ConfigureServiceHost(このする)。

以下の通りです system.serviceModelに以下を追加します。

<extensions>
      <behaviorExtensions>
        <add name="federatedServiceHostConfiguration" type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </behaviorExtensions>
    </extensions>

内の行を追加しますfolowingの下に

<behavior name="serviceBehavior">
          <federatedServiceHostConfiguration name="MyService" />

私の推測では、何が通話を傍受されないことです。どちらのCurrentPrincipalは、あなたがそれを検討しているか、別のスレッドにいる時間によってリセットされます。

、すぐにそれに割り当てた後CurrentPrincipalを確認し、正しい値が表示されるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top