0

我在我的 Windows 服务中托管 CassiniDev 4.0,为我的服务运行 MVC 3.0 配置站点。

我有 web.config 设置以使用 Windows 身份验证。当我查看网站中的 HttpContext.User 时,它显示了服务正在运行的身份,而不是发出请求的用户的身份。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(),否则将为登录用户发出的每个请求发出一个新请求,但未使用的请求永远不会被释放。一个可能的地方是在Request对象中,它是SimpleWorkerRequest的子类,您可以覆盖EndOfRequest方法以在安全令牌上调用 CloseHandle()。

于 2011-12-07T20:25:28.983 回答