覆盖单个页面的ASP.NET表单身份验证

时间:2009-06-02 21:02:41

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

在我们的ASP.NET MVC应用程序中,当用户尝试访问仅授权页面时,我们会自动将用户重定向到<authentication> <system.web>部分的登录页面。问题是应用程序中间的一个操作(设计为由工具使用)需要在错误访问时返回直接的HTTP 401响应。如何在没有重定向的特定操作的情况下返回真正的HTTP 401代码

3 个答案:

答案 0 :(得分:6)

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

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代码。然而,这对我来说非常麻烦。

答案 1 :(得分:4)

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

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

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

在您的情况下,您可能希望在不进行身份验证的情况下允许所有人:

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

答案 2 :(得分:0)

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

这解决了这个问题:

Response.SuppressFormsAuthenticationRedirect = true;