3

Windows認証を使用するWCFサービスがあり、それらを偽装して別のWCFサービスを呼び出したい場合、次のようにします。

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
    // call another WCF service
}

すべての構成設定を設定しましたが、クライアント側に次の行が含まれている限り、正常に動作します。

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;

しかし、呼び出しを行う前に、ユーザー トークンに委任権限があることを確認するにはどうすればよいでしょうか。つまり、私が制御していないクライアントは、AllowedPersonationLevel を設定しましたか?

設定していない場合、あらゆる種類の奇妙な例外がスローされます (アセンブリ X を読み込めないなど)。

理想的には、次のことができるようになりたいです。

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
    if (UserDoesntHaveDelegationRights())
        throw new SecurityException("No delegation rights");

    // call another WCF service
}

WindowsIdentity.GetCurrent().ImpersonationLevel は常に に等しいことに注意してください。そのTokenImpersonationLevel.Impersonationため、残念ながらオプションではありません。

4

2 に答える 2

6

ここでの定義には多少の混乱があるかもしれません。偽装レベルに関しては、Windows ID は次のようになります。

  • 偽装 - サービスはユーザーをローカルで偽装できます
  • 委任 - サービスはユーザーをリモートで偽装できます

委任する機能は非常に強力であるため、Active Directory では非常に制限されています。

  1. クライアントは委任を許可する必要があります
  2. 委任を行っているサービス アカウントは、Active Directory で「委任に対して信頼されている」としてマークする必要があります。

アカウントの委任を有効にする方法は次のとおりです。変更を行うには、Active Directory ドメイン管理者が必要です。私がこれまで働いてきたすべての企業環境には、委任を許可しないポリシーがあります。

質問に戻る:

そのため、TokenImpersonationLevel.Delegation存在している間は、セキュリティ リスクと見なされ、(あったとしても) めったに使用されません。TokenImpersonationLevel.Impersonationおそらくこれまでに得た最高レベルです。

TokenImpersonationLevel.Impersonation便利です。偽装されたユーザーとして、引き続きデータベースに接続したり、リモート サービス呼び出しを行うことができます。ただし、リモート サービス (同じボックス上ではない) は、ユーザーを再度偽装することはできません。基本的な経験則は、「偽装により 2 つのマシン ホップが可能になる」ことです。ユーザーの資格情報がさらに「ホップ」する必要がある場合、失敗します。

多くのサーバー間でユーザーの資格情報を渡す必要がある場合、最適な選択は、Windows Identity Foundation (WIF) などのフェデレーション セキュリティ モデルです。Active Directory での ID 管理を参照してください。

于 2013-03-15T15:52:09.897 に答える
0

どうですか

if (WindowsIdentity.GetCurrent().ImpersonationLevel != TokenImpersonationLevel.Delegation) ...
于 2013-03-13T15:49:46.257 に答える