我在我的 Windows 服务中托管 CassiniDev 4.0,为我的服务运行 MVC 3.0 配置站点。
我有 web.config 设置以使用 Windows 身份验证。当我查看网站中的 HttpContext.User 时,它显示了服务正在运行的身份,而不是发出请求的用户的身份。User.AuthenticationType 是 NTLM,这是正确的,顺便说一句。
这似乎很明显是一个错误,但想由社区运行它,看看是否有一些我遗漏的配置。
似乎它可能是上周发布的这个问题的一个变体:
我在我的 Windows 服务中托管 CassiniDev 4.0,为我的服务运行 MVC 3.0 配置站点。
我有 web.config 设置以使用 Windows 身份验证。当我查看网站中的 HttpContext.User 时,它显示了服务正在运行的身份,而不是发出请求的用户的身份。User.AuthenticationType 是 NTLM,这是正确的,顺便说一句。
这似乎很明显是一个错误,但想由社区运行它,看看是否有一些我遗漏的配置。
似乎它可能是上周发布的这个问题的一个变体:
这绝对是 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()。