【问题标题】:Skip Authentication For Custom Error Page跳过自定义错误页面的身份验证
【发布时间】:2015-03-26 11:28:03
【问题描述】:

我不太确定我为什么要为此苦苦挣扎,因为我确信它应该很简单。我创建了一个基于 .net 4.5 的 MVC 5 Web 应用程序。我在 web.config 中启用了 Windows 身份验证,如下所示;

<system.web>
   <Authentication mode="windows" />
</system.web>

这是完美的工作。实际上,我对新框架让它变得如此简单感到惊讶。当用户导航到我的站点时,它会对其进行身份验证并将其登录,这很酷。当它无法对用户进行身份验证时会产生 401 错误,我想为此错误提供一个自定义页面。为了捕捉 401,我使用了以下伪代码;

public class GlobalErrorAttribute : ErrorHandlerAttribute
{
     public override OnError(filterContext _context)
     {
         if(statusCode = 401)
         {
             _context.Result = RedirectTo("~/Errors/MyCustomPage");
         }
     }
}

这个重定向当然需要一个控制器,这很好,很基础;

public class ErrorsController : Controller
{
     public ActionResult MyCustomPage()
     {
          return View();
     }
}

我的问题

它重定向到的这个美妙的错误页面会抛出 401,因为它仍在尝试进行身份验证。 [AllowAnonymous] 将不起作用,因为这是授权。如何阻止 MVC 尝试进行身份验证?

这一定很简单,我可以想到一个你想要这种行为的常见示例。面向公众的网站可能希望在本地对员工使用 Windows 身份验证,但允许公众未经身份验证浏览。

我怎样才能做到这一点?

更新

当用户未通过身份验证时,401 会绕过我的 GlobalErrorAttribute?!?如何关闭页面的身份验证?就像自定义错误页面一样?

【问题讨论】:

  • 是“错误”控制器名称中的拼写错误还是 MVC 5 允许控制器名称不带“控制器”后缀?
  • 对不起,只是我懒惰,我没有复制和粘贴任何东西。虽然如果这是问题,我不会收到 401 :) 问候,Dan。

标签: c# asp.net-mvc authentication redirect error-handling


【解决方案1】:

可以使用配置文件中的&lt;location&gt; 元素指定必须应用指定配置设置的资源。

更多关于 MSDN 的信息: <location> Element

更新:

例如,您可以改进和添加类似这样的内容。

<location path="Errors/MyCustomPage">
  <system.web>
    <authorization>
      <allow verbs="GET" users="*" />
    </authorization>
  </system.web>
</location>

【讨论】:

  • 我确实尝试过这个,虽然我在某处读到它在 .net 4.5 和 MVC 5 中不受支持?我再试一次 :) 问候,丹。
  • 这似乎已经解决了这个问题,我怎样才能将它应用于多个文件?有什么方法可以在属性中获取它?
  • 我不太确定,但我认为您将无法在路径属性中指定多个文件。但是,您应该能够指定其中的几个 元素 - 每个文件一个。如果这回答了您的问题,请记得投票。
  • 这似乎是新身份验证的一个巨大缺陷。如果我有一个不想在其上进行身份验证的整个控制器怎么办?
  • 我推测您可能能够单独指定根路径,它将适用于那里的所有资源。这意味着您可以单独指定“错误”(没有特定的“MyCustomPage”操作)并将配置设置应用于国外的所有操作。
【解决方案2】:

更新 通过命令行 appcmd set config /section:anonymousAuthentication /enabled:true 为应用启用匿名认证

【讨论】:

  • 导致 401 的不是授权,而是身份验证。
  • 啊,抱歉。让我们再看看。
  • 您是否通过命令行 appcmd set config /section:anonymousAuthentication /enabled:true 为application 启用匿名身份验证
  • 我不知道你在说什么,但是我确实在 IIS 中打开了匿名身份验证。上一个答案解决了这个问题,但这仅适用于一页,这似乎是一个相当糟糕的解决方案。不过我很欣赏这个答案,也许我应该研究一下。
  • 这有点奇怪,但是他们必须允许开发人员在他们想要adopt 的机密性、完整性和可用性之间做出权衡。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2016-05-28
  • 2020-04-30
相关资源
最近更新 更多