3

我在 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 为空(我认为这在 ASP.NET 中永远不应该为空)。

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

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

4

2 回答 2

2

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

于 2011-01-17T15:16:51.267 回答
2

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


typeof(principal.Identity);

得到真正的。

于 2011-01-17T13:28:25.533 回答