我有一个 ASP.NET MVC Intranet 站点,该站点仅使用 Windows 身份验证 (Kerberos) 和直通身份验证。它设置为使用使用网络服务标识的应用程序池(v4/集成)。该网站在另一台计算机(SAMBA NAS 盒)上托管的网络共享之上提供了漂亮的 UI。有时(通常是当有人有一段时间没有访问该站点时),客户端在 MVC 代码尝试获取远程 UNC 共享上的目录信息 (System.IO.Directory.GetLastWriteTime) 时会收到 401 授权错误。 IIS 计算机上的事件日志在同一时间点捕获安全审核失败:
+ System - Provider [ Name] Microsoft-Windows-Security-Auditing [ Guid] {54849625-5478-4994-a5ba-3e3b0328c30d} EventID 4625 Version 0 Level 0 Task 12544 Opcode 0 Keywords 0x8010000000000000 - TimeCreated [ SystemTime] 2012-03-17T00:43:50.522Z EventRecordID 398873 Correlation - Execution [ ProcessID] 696 [ ThreadID] 792 Channel Security Computer lvtloweb1.acme.com Security - EventData SubjectUserSid S-1-0-0 SubjectUserName - SubjectDomainName - SubjectLogonId 0x0 TargetUserSid S-1-0-0 TargetUserName TargetDomainName Status 0xc000006d FailureReason %%2304 SubStatus 0xc0000133 LogonType 3 LogonProcessName Kerberos AuthenticationPackageName Kerberos WorkstationName - TransmittedServices - LmPackageName - KeyLength 0 ProcessId 0x0 ProcessName - IpAddress - IpPort -
奇怪的是,如果您坐下来一遍又一遍地刷新页面,通常大约一分钟后就会出现 401 错误。有人对如何解决此类问题有任何想法吗?哦,是的,IIS 机器托管在虚拟机中。 guest 操作系统是 Windows Server 2008 Enterprise 6.0.6002 Service Pack 2。
最佳答案
基思,
由于它似乎大多数发生在用户空闲之后,我倾向于某种可能会使服务器的凭据无效的事件(即 session 超时)。我假设只有一台服务器,因为您没有提到任何网络场。
我的一部分认为您可能已经敲定了 session 超时角度。除非您觉得安全,相信用户会“自动身份验证”,并且操作中超时不会导致其失败。也就是说,我不确定我是否完全相信情况确实如此。为了至少消除这种可能性,我将添加一个例程,在该操作开始之前记录有关当前 session /凭据的信息。即使用户“始终登录”(假设他们在自己的计算机上),我也看到过 VPN、代理服务器、服务器双跳、“受信任区域”的 IE 配置和“内联网”设置方面的奇怪问题。即使计算机突然更改到服务器的路由也可能会导致问题。我不确定虚拟机上的网络模拟是否会发挥作用,但谁知道呢。
这是一篇关于 IE 的“入门”文章,它是一种复杂的身份验证方法,以及它作为访问 Intranet MVC 应用程序的客户端应用程序所扮演的角色。 (深入研究 IE 如何在 Windows AD 环境中自动进行身份验证是值得的。)
http://support.microsoft.com/kb/258063/en-us
这是某人因双跳导致 401 而遇到的相关问题。我还提供了另一个很好的“起始页”的链接,用于调查此类问题。
http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx
很抱歉,如果您已经知道上面的内容或我的回复的一般性质。如果没有实际的网络访问权限或无法向代码添加日志记录,这会很困难。我希望我已经为您指明了正确的方向。
关于ASP.NET MVC 间歇性 401 授权错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746443/