これは間違いなく 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() を呼び出すことができます。