在Windows服务中托管时,Cassini-Dev中的窗口标识不正确

时间:2011-12-01 22:20:35

标签: asp.net c#-4.0 cassini-dev

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

我有web.config设置来使用Windows身份验证。当我查看网站中的HttpContext.User时,它会显示运行该服务的标识,而不是发出请求的用户的重复性。 User.AuthenticationType是NTLM,这是正确的,BTW。

这似乎很明显是一个错误,但是希望社区运行它以查看是否存在我缺少的一些配置。

似乎这个问题可能是这个问题的一个变种:

SecurityIdentifiers in Cassini-dev's NTLM authentication

1 个答案:

答案 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()。