Asp.net mvc 401.0-未经授权-使用IIS 7的MVC应用程序

Asp.net mvc 401.0-未经授权-使用IIS 7的MVC应用程序,asp.net-mvc,iis-7.5,windows-server-2008-r2,windows-server-2003,Asp.net Mvc,Iis 7.5,Windows Server 2008 R2,Windows Server 2003,我有一个MVC应用程序,通常工作正常,但在一个特定的服务器上,它返回一个401.0“经过身份验证的用户无权访问处理请求所需的资源”错误 通常它是这样工作的: 用户登录到一个单独的应用程序,获取用户ID和令牌,单击指向此应用程序的链接。用户ID和令牌进入URL 用户使用匿名身份验证进入我的应用程序,然后在我们的LogonAuthorize过滤器中,我们从查询字符串中获取ID和令牌以对用户进行身份验证 我已经登录到过滤器中,我可以看到用户正在进行身份验证。所以,他们至少走了这么远。但是,IIS出现了

我有一个MVC应用程序,通常工作正常,但在一个特定的服务器上,它返回一个401.0“经过身份验证的用户无权访问处理请求所需的资源”错误

通常它是这样工作的:

  • 用户登录到一个单独的应用程序,获取用户ID和令牌,单击指向此应用程序的链接。用户ID和令牌进入URL
  • 用户使用匿名身份验证进入我的应用程序,然后在我们的LogonAuthorize过滤器中,我们从查询字符串中获取ID和令牌以对用户进行身份验证
  • 我已经登录到过滤器中,我可以看到用户正在进行身份验证。所以,他们至少走了这么远。但是,IIS出现了401.0未经授权的错误,而不是他们应该看到的页面

    我尝试过的事情:

    • 授予IUSR对目录的访问权限
    • 运行mirate.exe(这是一个实体框架应用程序)
    • 正在删除解决方案中的所有[授权]属性。。。我知道我们尽可能使它成为BaseController对象的Initialize()事件。我们似乎没有将其加入到特定的控制器操作中,例如继承BaseController的Home/Index。在BaseController.Initialize()之后,我看不到任何日志记录
    • 授予网络服务对目录的访问权限
    • 将应用程序池从Integrated切换到Classic(我得到的是一个空白屏幕,而不是401.0错误,这很奇怪。日志中的身份验证内容相同。)
    • 在应用程序池中使用本地用户帐户而不是网络服务,允许该帐户访问目录
    • 设置“匿名”要使用的不同帐户
    • 重建和重新部署应用程序(多次)
    • 不同的身份验证方案:打开Windows auth会得到401.1,关闭所有这些方案会得到401.2
    • 确保Global.asax位于正确的位置
    • aspnet_regiis-i
    • 把我的头发都扯下来(适得其反)
    我为这个错误设置了一个跟踪规则,我有一个跟踪,但我不知道如何读取它。我会把它粘贴到这里,但它是一个相当长的XML文件

    错误来自模块ManagedPipelineHandler、通知ExecuteRequestHandler、handler System.Web.Mvc.MvcHandler,错误代码为0x00000000

    一个细节:此服务器配置为使用端口90而不是端口80。我不知道为什么会有问题,但也许会

    另一个细节:该应用程序作为一个应用程序运行在“主”应用程序下的虚拟目录中,该应用程序被配置为根网站


    一个新的详细信息:此服务器是Windows server 2008 R2,是从Windows server 2003升级而来的。我相信升级过程中的某些因素可能会导致这一问题,因为针对这类问题的“常见可疑”解决方案都没有帮助。

    这里的解决方案似乎是打开Windows auth并关闭其他形式的身份验证,这是违反直觉的。但你看。。。这就是成功的原因


    如果有人想发布一个答案,解释为什么这是我的答案,我会给他们奖金。

    所以你找到了解决方案,但要求澄清为什么它有效。这可能是其中一种情况

    您的网站/web应用程序似乎是通过过期的特定用户凭据托管的。下一次当您通过新凭据删除和添加windows身份验证或应用程序传递时,它会起作用

    在使用特定用户路径凭据托管的一个测试web应用程序中,我遇到了类似的情况。每次更改/过期用户密码时。Web应用程序停止工作


    Windows首先使用Kerberos进行身份验证。接下来,它尝试其他身份验证方法。你的要求是NTLM。关闭除Windows身份验证之外的所有身份验证将迫使应用程序尝试NTLM,但成功了。

    应用程序中是否存在任何cookie共享或单一登录?您如何检查可访问性?我的意思是,您是否检查了来自同一台机器或不同机器的托管应用程序?两台服务器上是否安装了相同版本的MVC和.net?请参阅我发布的答案