代码之家  ›  专栏  ›  技术社区  ›  Benjamin Pollack Stefan Rusek

覆盖单页的ASP.NET窗体身份验证

  •  5
  • Benjamin Pollack Stefan Rusek  · 技术社区  · 17 年前

    在我们的ASP.NET MVC应用程序中,我们通过 <authentication> 截面 <system.web> 当他们试图访问仅授权的页面时。问题是,应用程序中间的一个操作(设计为工具使用)需要在错误访问时直接返回HTTP401响应。如何返回真正的HTTP 401代码 没有 此特定操作的重定向?

    3 回复  |  直到 10 年前
        1
  •  6
  •   Benjamin Pollack Stefan Rusek    17 年前

    下面的解决方案是有效的,尽管我一点也不确定它是最佳的:

    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
  •  4
  •   Randolpho    17 年前

    你可以分开 <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>
    
        3
  •  0
  •   micahhoover    10 年前

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

    这解决了问题:

    Response.SuppressFormsAuthenticationRedirect = true;