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

Forms Authentication: How to handle unauthorized authenticated user

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

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

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

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

2 检查:他们是否通过身份验证 && 是否有 return url(如果发送到登录页面,它将在那里)。

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

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

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

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

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

Forms authentication: disable redirect to the login page

未经授权的重定向状态代码是 302,但是当它被重定向到登录页面时,它会覆盖状态 200。 为了将用户重定向到 Unauthorize 页面而不是登录页面,Hack 将在全局中实施 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");
        }
    }