ASP.NET MVC:IPrincipal如何为null?

时间:2011-01-17 12:56:22

标签: c# asp.net-mvc-2 iis-6 windows-server-2003 iprincipal

我在IIS6 / Server 2003上运行一个网站,该网站在本地Intranet上使用集成Windows身份验证。我可以浏览到该站点,但在调用以下C#代码时会出现间歇性的“Object null”错误,每次请求都会调用该代码:

.... 
GetUserIdFromPrincipal(User) 
....  

public static string GetUserIdFromPrincipal(IPrincipal principal) {     
     return principal.Identity is WindowsIdentity ? (principal.Identity as WindowsIdentity).User.Value : principal.Identity.Name; 
} 

因为错误是间歇性的,Windows Auth正在某种程度上工作但是在浏览网站几次点击之后我得到空引用错误意味着IPrincipal为null(我认为这在ASP.NET中永远不会为null)。

错误仅发生在新构建的VM上。代码在其他机器上很好,当然在本地开发时也是如此。

IIS是否在每个请求中请求Windows身份验证详细信息?什么会导致这种间歇性问题?任何帮助或建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

我建议,你的身份不是WindowsIdentity,因此案件将失败并导致空对象。 IIdenty可能是FormsIdentity,ClientFormsIdentity,GenericIdentity,PassportIdentity和WindowsIdentity,我想你应该试试


typeof(principal.Identity);

获得真实的。

答案 1 :(得分:2)

我认为上面的情况是因为我们在IIS6中检查了Windows Auth和Anonymous。这似乎造成IIS有时会使用Windows Auth并因此创建IPrincipal的情况,但其他时候会使用匿名身份验证而不会创建IPrinciple。当然,关闭Anonymous Auth选项似乎已经解决了这个问题。