現時点では、Asp.net MVC アプリケーションで使用される WCF サービスを使用しています。
セキュリティ上の理由から、ユーザー名とパスワードを表す GUID を使用しています。(ユーザーがログインすると、WCF は Active Directory の資格情報をチェックし、GUID をユーザー名とパスワードに接続するデータベース テーブルにレコードを作成します) ユーザーが別のサービスを使用するときは、この GUID をヘッダーと共に送信します。この GUID を使用して、wcf でユーザーを偽装したいと考えています。次のことを(authorizationManagerを使用して)試しましたが、うまくいきません。
public class MyAuthBehaviour :ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
var index = operationContext.IncomingMessageHeaders.FindHeader("identifier", "");
if (index >= 0)
{
string identifier = operationContext.IncomingMessageHeaders.GetHeader<string>(index);
AddWindowsID(identifier);
}
return true;
}
private void AddWindowsID(string identifier)
{
WindowsIdentity wid = AccountBL.GetWindowsIdentity(identifier);
wid.Impersonate();
}
}
WindowsIdentity は取得できますが、偽装できません。これを行う方法はありますか?
簡単に言うと、ヘッダーの GUID を使用して実際のサービス メソッドに到達する前に、WCF 内でユーザーになりすます必要があります。
wid.Impersonate() がヒットすると、クライアントは次の例外をスローします。
内部エラーのため、サーバーは要求を処理できませんでした。エラーの詳細については、サーバーで (ServiceBehaviorAttribute または構成動作のいずれかから) IncludeExceptionDetailInFaults をオンにして、例外情報をクライアントに送り返すか、Microsoft .NET Framework SDK ドキュメントに従ってトレースをオンにして、サーバーのトレース ログを調べます。
WCF は実行を続けます (ただし、WCF サービスで trown が発生する場合は例外です)
wid.Impersonate() が実行されたときに例外はスローされず、 MyAuthBehaviour クラスを離れるときに発生します