Asp.net MVC Windows身份验证提示输入Windows凭据并忽略自定义错误配置

Asp.net MVC Windows身份验证提示输入Windows凭据并忽略自定义错误配置,asp.net,asp.net-mvc,asp.net-mvc-4,authorization,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Authorization,在使用Windows身份验证和自定义角色提供程序在IIS7.5服务器(集成管道)上运行MVC4的web应用程序中,如果有人试图访问他们没有权限访问的内容,我希望在401个未授权错误上显示自定义错误页 当我在VisualStudio中进行本地调试时,错误页面将正确显示,我的漂亮的自定义“未授权”页面将按预期显示 部署到服务器-我会得到windows提示 以下是web.config的(我认为)相关部分: <?xml version="1.0" encoding="utf-8"?> &l

在使用Windows身份验证和自定义角色提供程序在IIS7.5服务器(集成管道)上运行MVC4的web应用程序中,如果有人试图访问他们没有权限访问的内容,我希望在401个未授权错误上显示自定义错误页

当我在VisualStudio中进行本地调试时,错误页面将正确显示,我的漂亮的自定义“未授权”页面将按预期显示

部署到服务器-我会得到windows提示

以下是web.config的(我认为)相关部分:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authentication mode="Windows" />
    <authorization>
      <deny users="?"/>
    </authorization>
    <roleManager enabled="true" defaultProvider="MyCustomRoleProvider">
      <providers>
        <clear />
        <add name="FimOpsAccessControlRoleProvider" type="Namespace.MyCustomRoleProvider" />
      </providers>
    </roleManager>
    <customErrors mode="On" defaultRedirect="~/Error">
      <error redirect="~/Error/Error401" statusCode="401" />
    </customErrors> 
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="401" />
      <error statusCode="401" path="/error/error401" responseMode="ExecuteURL" />
    </httpErrors>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
</configuration>

在生产服务器上,我可以很好地浏览到/error/error401——我还尝试用一个静态html文件替换它,并指向它,得到了相同的结果

我尝试过静态错误页面,在global.asax Application_OnError中做过一些事情,在web.config中可以想到的每一种配置组合,但都没有成功。我在网上找到了至少10篇其他的帖子来处理这个问题,但是没有一个解决方案适合我——可能是因为版本不同,我不知道


为什么会发生这种情况?我该如何避免这种情况?

我不认为您可以为Windows身份验证覆盖浏览器的行为。此身份验证是在到达应用程序代码之前由web服务器进行的。因此,IMHO放置自定义错误页面不会有多大帮助。如果您希望对这些对话框的UI进行更多的控制,可以考虑使用混合模式:表单验证和用户身份验证。现在,您可以完全控制登录屏幕以及在401事件中显示的内容。

这也让我抓狂,在尝试了几乎所有可能的组合后,我能够通过使用
responseMode=“File”
使其工作。与您一样,我有一个MVC站点,但无法使
responseMode=“ExecuteURL”
正常工作,因此我返回的文件将简单地将用户重定向到正确的控制器/操作组合。以下是我的web.config文件中的内容:

<httpErrors existingResponse="Replace" errorMode="Custom">
    <remove statusCode="401" subStatusCode="-1" />
    <error statusCode="401" prefixLanguageFilePath="" path="AuthRedirect.html" responseMode="File" />
</httpErrors>

在重定向文件中,我只使用onload事件重定向。添加文本和链接可能也很明智:

<body onload="window.location = '/Account/Login'">


但这真的是浏览器行为,而不是服务器/应用程序吗?从Visual Studio运行时,它可以完美地工作-仅当部署到IIS时,它将无法工作。集成Windows身份验证保护网站的登录框的行为依赖于浏览器。我感谢您的回答,但这仍然困扰着我。:)如果这是一个浏览器行为的问题,而不是服务器行为的问题,那么当我在本地运行它(在visual studio中调试)时,它为什么工作?您使用哪个服务器在本地运行?是IIS快车吗?您启用Windows身份验证了吗?