我正在尝试设置一个非常基本的Forms身份验证示例。
正确地将未经身份验证的用户重定向到登录页面 并提交验证凭证和正确的呼叫:
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>
更新
根据答案/评论/研究,我有两个有效的解决方案。
将以下内容放入Login窗体的Page_Load方法中:
if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
{
// This is an unauthorized, authenticated request...
Response.Redirect("FailedAuthorization.aspx");
}
或
将以下内容放入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;
}
}
感谢您对此提供的所有帮助!
答案 0 :(得分:2)
不幸的是,这是ASP.NET不断出错的事情之一。尽管MS和.NET框架团队完全理解了身份验证和授权之间的区别,但他们仍然坚持将未经授权的处理视为未经身份验证。我不知道为什么会这样。
这只是FormsAuthentication模块处理程序的一个怪癖,因为它返回401 Unauthorized而不是403 Forbidden。 (HTTP标准也无法以这种方式将身份验证与授权混淆)。
这不是你可以轻易覆盖的东西,所以你唯一的办法就是做一些事情,例如检查你的登录页面,看看他们是否已经登录,如果他们被重定向......这不是万无一失的,但它是一种方法来处理它。
您没有说明您正在使用的.NET版本,但如果您使用的是.net 4.5,那么您还有另一个选项,即使用本文中的SuppressFormsAuthenticationRedirect选项:
答案 1 :(得分:1)
2次检查:是否经过身份验证&amp;&amp;如果有一个返回URL(如果发送到登录页面将会存在)。
if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
{
// This is an unauthorized, authenticated request...
Response.Redirect("~/somewhere.aspx");
}
答案 2 :(得分:0)
未经授权的重定向状态代码是 302,但是当它被重定向到登录页面时,它会被状态 200 覆盖。 为了将用户重定向到 Unauthorize Page 而不是登录页面,Hack 是在 Global 中实现 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");
}
}