0

サービスの MVC 3.0 構成サイトを実行している Windows サービスで CassiniDev 4.0 をホストしています。

Windows認証を使用するためのweb.configセットアップがあります。Web サイトで HttpContext.User を見ると、リクエストを行っているユーザーのアイデンティティーではなく、サービスが実行されている ID が示されます。User.AuthenticationType は NTLM ですが、これは正しいです。

これは明らかにバグのようですが、コミュニティで実行して、不足している構成がないかどうかを確認したかったのです。

先週投稿されたこの問題のバリエーションのようです。

Cassini-dev の NTLM 認証における SecurityIdentifiers

4

1 に答える 1

0

これは間違いなく Cassini Dev のバグです。このメソッドが間違ったトークンを返しているようです: Request.GetUserToken(). コード:

public override IntPtr GetUserToken()
{
    return _host.GetProcessToken();
}

ここで _host.GetProcessToken() は、Cassini プロセスを所有するユーザーに属するセキュリティ トークンへのポインタであり、ログインしているユーザーに属するトークンではありませんNtlmAuth。オブジェクトがセキュリティ トークンを渡す必要があることです。ホストのトークンの代わりにこのメソッドが呼び出されたときに返されるように、Requestオブジェクトに戻します。これを行う最善の方法が何であるかはよくわかりませんが、NtlmAuthクラスで確認できます。セキュリティ トークンはここで取得されます。

IntPtr phToken = IntPtr.Zero;
if (Interop.QuerySecurityContextToken(ref _securityContext, ref phToken) != 0)
{
     return false;
}

phTokenはセキュリティ トークンですが、Request オブジェクトに戻る必要があり、Interop.CloseHandle(phToken);後でトークンを解放するメソッドで呼び出さないでください。最終的にトークンで CloseHandle() を呼び出す必要があることに注意してください。そうしないと、ログインしているユーザーが行うすべてのリクエストに対して新しいものが発行されますが、使用されていないものは決して解放されません。これを実行できる場所の 1 つは、SimpleWorkerRequestRequestをサブクラス化するオブジェクト内であり、 EndOfRequestメソッドをオーバーライドして、セキュリティ トークンで CloseHandle() を呼び出すことができます。

于 2011-12-07T20:25:28.983 に答える