【问题标题】:Override ASP.NET forms authentication for a single page覆盖单个页面的 ASP.NET 表单身份验证
【发布时间】:2009-06-02 21:02:40
【问题描述】:

在我们的 ASP.NET MVC 应用程序中,当用户尝试访问仅授权页面时,我们会通过 <system.web><authentication> 部分自动将用户重定向到登录页面。问题是应用程序中间的一个操作,旨在供工具使用,需要在访问错误时返回直接的 HTTP 401 响应。我怎样才能返回真正的 HTTP 401 代码没有此特定操作的重定向?

【问题讨论】:

    标签: asp.net asp.net-mvc authentication forms-authentication


    【解决方案1】:

    以下解决方案有效,尽管我完全不确定它是否最佳:

    public class HttpAuthenticationRequiredResult : ActionResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            var response = context.HttpContext.Response;
            response.StatusCode = 401;
            response.AddHeader("WWW-Authenticate", "Basic realm=\"whatever\"");
            response.Flush();
            response.Close();
        }
    }
    

    然后您可以返回上述结果而不是 HttpUnauthorizedResult 来生成所需的 401 代码。然而,这对我来说感觉很笨拙。

    【讨论】:

      【解决方案2】:

      您可以为单独的路径设置单独的 <system.web> 部分。这是一个例子:

      <configuration>
        <location path="Foo/Bar.aspx">
          <system.web>
            <authorization>
              <allow roles="GoodGuys" />
              <deny users="*"/>
            </authorization>
          </system.web>
        </location>
      </configuration>
      

      在这种情况下,“Foo/Bar.aspx”页面允许具有 GoodGuys 角色的人使用,但拒绝所有其他人使用。

      在您的情况下,您可能希望无需身份验证就允许所有人:

      <configuration>
        <location path="Foo/Bar.aspx">
          <system.web>
            <authentication mode="None" />
            <authorization>
              <allow users="*" />
            </authorization>
          </system.web>
        </location>
      </configuration>
      

      【讨论】:

      • 如果这是直接的 ASP.NET,那会起作用,但我不清楚如何在 ASP.NET MVC 中使用该技术。问题是 should-return-401 URL 位于 myapp/{rout parameter}/tool;即使我想,也无法在 system.web 中指定。
      • 虽然这适用于授权元素,但它不适用于身份验证 - 我收到以下错误:在处理服务此请求所需的配置文件期间发生错误。请查看下面的具体错误详细信息并适当地修改您的配置文件。在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的部分是错误的。
      • 我得到与 Ben Laan 相同的错误。我在 FormsAuthentication 上苦苦挣扎。它按预期工作,但是对于发生一些 ajax 请求的页面,我不希望 401 代码被 302 覆盖以最终进入登录页面。执行应该以我放在响应上的状态代码结束。
      【解决方案3】:

      有一个类似的情况,我需要返回一些触发了不需要的重定向的东西(基本上是一条关于身份验证失败的消息,它被重定向到没有错误信息的登录屏幕)。

      这解决了问题:

      Response.SuppressFormsAuthenticationRedirect = true;
      

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多