代码之家  ›  专栏  ›  技术社区  ›  Baxter

表单身份验证:如何处理未经授权的身份验证用户

  •  3
  • Baxter  · 技术社区  · 11 年前

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

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

    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;
          }
      }
      

    谢谢你的帮助!

    3 回复  |  直到 11 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    不幸的是,这正是ASP.NET不断出错的原因之一。尽管MS和.NET框架团队完全理解身份验证和授权之间的区别,但他们仍然坚持将未经授权视为未经身份验证。我不知道为什么。

    这只是FormsAuthentication模块处理程序的一个怪癖,因为它返回的是401未授权,而不是403禁止。(HTTP标准以这种方式将身份验证与授权混淆,这并没有帮助)。

    这不是你可以轻易覆盖的,所以你唯一的办法就是检查你的登录页面,看看他们是否已经登录,以及他们是否被重定向。。。这不是万无一失的,但这是一种处理方法。

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

    Forms authentication: disable redirect to the login page

        2
  •  2
  •   wazz    11 年前

    2项检查:如果他们已通过认证&&如果有一个返回url(如果发送到登录页面,它将在那里)。

    if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
    {
        // This is an unauthorized, authenticated request... 
        Response.Redirect("~/somewhere.aspx");
    }
    
        3
  •  0
  •   Mohsin Sharif    5 年前

    未经授权的重定向状态代码为302,但当它重定向到登录页面时,该代码将覆盖状态200。 为了将用户重定向到未授权页面而不是登录页面,黑客将在全局中实现Application_EndRequest,并检查响应状态代码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");
            }
        }
    
    推荐文章