我在运行MVC 3.0配置站点的Windows服务中托管CassiniDev 4.0。
我有web.config设置来使用Windows身份验证。当我查看网站中的HttpContext.User时,它会显示运行该服务的标识,而不是发出请求的用户的重复性。 User.AuthenticationType是NTLM,这是正确的,BTW。
这似乎很明显是一个错误,但是希望社区运行它以查看是否存在我缺少的一些配置。
似乎这个问题可能是这个问题的一个变种:
答案 0 :(得分:0)
这绝对是卡西尼开发中的一个错误。看起来这个方法返回了错误的令牌: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()。