3

我正在尝试设置一个非常基本的表单身份验证示例。

它正确地将未经身份验证的用户重定向到登录页面,并在提交验证凭据时正确调用:

FormsAuthentication.RedirectFromLoginPage(username.Text, false);

如果用户是授权部分中指定的用户,他们将获得他们的页面。如果不是,它会将它们弹回登录页面而没有错误。

如何将经过正确身份验证但未经授权的用户重定向到特定错误页面或检测授权错误以在登录页面反弹时显示错误消息?

这是我的 web.config

   <authentication mode="Forms">
      <forms name=".ASPXAUTH" loginUrl="/forms/Login" />
    </authentication>
    <authorization>
      <deny users="?" />
      <allow users="username1, username2" />
      <deny users="*" />
    </authorization>

更新:

根据答案/评论/研究,我有两个可行的解决方案。

  1. 将以下内容放入登录表单的 Page_Load 方法中:

        if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
        {
            // This is an unauthorized, authenticated request... 
            Response.Redirect("FailedAuthorization.aspx");
        }
    

或者

  1. 将以下内容放入 Global.aspx 文件中:

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        if (Response.StatusCode == 401)
        {
            //Use the built in 403 Forbidden response
            Response.StatusCode = 403;
    
            //OR redirect to custom page
            //Response.Redirect("FailedAuthorization.aspx");
        }
    }
    
    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
        {
            // Requires ASP.NET >= 4.5
            Response.SuppressFormsAuthenticationRedirect = true;
        }
    }
    

感谢您为此提供的所有帮助!

4

3 回答 3

3

不幸的是,这是 ASP.NET 不断出错的事情之一。尽管 MS 和 .NET 框架团队非常了解身份验证和授权之间的区别,但他们仍然坚持将未经授权视为未经身份验证。我不知道为什么会这样。

这只是 FormsAuthentication 模块处理程序的一个怪癖,因为它返回 401 Unauthorized 而不是 403 Forbidden。(HTTP 标准也以这种方式混淆了身份验证和授权,这无济于事)。

这不是您可以轻松覆盖的事情,因此您唯一的办法就是检查您的登录页面以查看他们是否已经登录,以及他们是否被重定向......这不是万无一失的,但它是一种方法处理它。

您没有说您使用的是哪个版本的 .NET,但如果您使用的是 .net 4.5,那么您还有另一个选择,即使用本文中的 SuppressFormsAuthenticationRedirect 选项:

表单身份验证:禁用重定向到登录页面

于 2015-03-17T04:09:07.017 回答
2

2 次检查:他们是否已通过身份验证 && 是否有返回 url(如果发送到登录页面就会出现)。

if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
{
    // This is an unauthorized, authenticated request... 
    Response.Redirect("~/somewhere.aspx");
}
于 2015-03-17T03:46:36.500 回答
0

未经授权的重定向状态代码是 302,但是当它被重定向到登录页面时,它会覆盖状态 200。为了将用户重定向到 Unauthorize 页面而不是登录页面,Hack 是在 Global 中实现 Application_EndRequest 并检查 Response Status Code 302,这是从当前被调用的操作的临时重定向。

protected void Application_EndRequest(object sender, EventArgs e)
    {
        if(HttpContext.Current.Response.StatusCode == 302 && User.Identity.IsAuthenticated)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Redirect("/UnauthorizedPageUrl");
        }
    }
于 2021-02-16T13:42:29.990 回答