我有一个部署到 Server 2008 IIS 7.5 框的 Web 应用程序。
从远程出现此错误:401 - Unauthorized: Access is denied due to invalid credentials
。(远程 = 同一局域网上的桌面)
已经尝试使用不同浏览器的多个远程客户端,结果都相同。(IE、FF 和 Chrome)
从服务器本身的桌面运行正常。但是我还没有在服务器桌面上尝试过 Firebug。我猜它仍然发出 401 状态代码,但无论如何都会返回内容。请参阅更新 #2。
该应用程序正在使用匿名身份验证。
该应用程序使用 MVC 框架在 .NET 4.0 Asp.Net 中编写。
静态内容工作正常,例如:http://server.com/content/image.jpg
Sysinternalsprocmon
对每个请求返回以下 2 个结果:FAST IO DISALLOWED 和 PATH NOT FOUND。
我在同一台服务器上有另外 2 个 MVC 应用程序运行良好。我已检查文件夹的安全性,它们全部匹配。
应用程序在 Server 2008 IIS 7.0 上运行良好。
服务器上的事件日志中没有显示与此相关的任何内容。
这让我很为难,有什么解决方法吗?
更新 #1:我越深入研究,就越觉得这太不可思议了。
如果我点击 IIS 管理器中的应用程序 -> 错误页面 -> 编辑功能设置选择Detailed Errors
,应用程序将远程运行。如果不保留此功能,那么问题尚未解决,只会更加令人困惑。
更新 #2:使用 Firebug,我看到状态仍然是401 Unauthorized
,但响应返回了应用程序的正确 HTML。
更新 #3尝试失败请求跟踪,以下是导致 401 的警告请求跟踪:
ModuleName ManagedPipelineHandler
Notification 128
HttpStatus 401
HttpReason Unauthorized
HttpSubStatus 0
ErrorCode 0
ConfigExceptionInfo
Notification EXECUTE_REQUEST_HANDLER
ErrorCode The operation completed successfully. (0x0)
更新 #4常规 IIS 日志显示以下内容:
#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2010-07-20 19:17:22
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2010-07-20 19:17:22 10.10.1.10 GET /Purchasing/Home - 80 - 10.10.1.12 Mozilla/5.0+(Windows;+U;+Windows+NT+6.1;+en-US;+rv:1.9.2.6)+Gecko/20100625+Firefox/3.6.6 401 0 0 4414
答案1
有时你必须退后一步......造成这种情况的原因是,Html.RenderAction()
在我看来,它调用了一个[Authorize]
标有属性的操作方法。
答案2
由于它在本地工作,但在远程不工作,所以在我看来,匿名用户帐户无权访问某些内容,但您的 Windows 用户可以访问。为了证明这一点,请关闭网站的 Windows 身份验证,看看它是否在本地中断。
无论发生什么问题,都可能是以您的网站身份而不是您的应用程序池身份运行的,否则它会在本地和远程发生故障。如果您有 1 对 1 的网站到应用程序池映射,或者您有一个高度受信任的环境,我的建议是将匿名用户帐户设置为使用应用程序池身份。这样您就不必担心维护第二个用户了。
您提到了进程资源管理器。它很适合查找运行信息,但可能发现拒绝访问错误的工具是 processmon(也来自 sysinternals)。尝试一下,重现并捕获,然后搜索单词“denied”。它应该会显示磁盘上的任何拒绝访问问题。
答案3
AuthorizeAttribute
当您有一个继承自的自定义授权过滤器并调用一个或多个方法时,您将有同样的行为OnAuthorization
,其中一个设置 AuthorizationContext.Result
为“HttpUnauthorizedResult”
答案4
您是否检查过授权规则下的设置?如果任何人都可以访问此页面(这似乎是您的目标),请确保您有一个“允许”规则,该规则在用户列下包含“所有用户”。
然后在“身份验证”中确保没有冲突并且只启用了匿名身份验证。
希望有所帮助。