ASP.NET登录重定向循环,当用户不在角色中时

9
我在实现ASP.NET MVC 5中的角色时遇到了一些问题。我试图以一个没有访问应用程序区域所需角色的用户身份登录,但是在这种情况下,我期望的是被重定向到登录页面,并且只有在输入具有访问权限的凭据或导航到应用程序的另一个区域后才会停止。
实际上发生的情况是应用程序似乎进入了一个登录重定向循环,通过调试发现Login操作被多次调用。以下是登录操作:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

这会导致IIS生成一个错误:
HTTP Error 404.15 - Not Found
The request filtering module is configured to deny a request where the query string is too long.

查询字符串看起来像这样:
http://localhost/MyApplication/Account/Login?ReturnUrl=%2FMyApplication%2FAccount%2FLogin%3FReturnUrl%3D%252FMyApplication%252FAccount%252FLogin%253FReturnUrl%253D%25252FMyApplication%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FMyApplication%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FMyApplication%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FMyApplication%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FMyApplication%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525252FMyApplication%252525252525252FAccount%252525252525252FLogin%252525252525253FReturnUrl%252525252525253D%25252525252525252FMyApplication%25252525252525252FAccount%25252525252525252FLogin%25252525252525253FReturnUrl%25252525252525253D%2525252525252525252FMyApplication%2525252525252525252FAccount%2525252525252525252FLogin%2525252525252525253FReturnUrl%2525252525252525253D%252525252525252525252FMyApplication%252525252525252525252FAccount%252525252525252525252FLogin%252525252525252525253FReturnUrl%252525252525252525253D%25252525252525252525252FMyApplication%25252525252525252525252FAccount%25252525252525252525252FLogin%25252525252525252525253FReturnUrl%25252525252525252525253D%2525252525252525252525252FMyApplication%2525252525252525252525252FAccount%2525252525252525252525252FLogin%2525252525252525252525253FReturnUrl%2525252525252525252525253D%252525252525252525252525252FMyApplication%252525252525252525252525252FAccount%252525252525252525252525252FLogin%252525252525252525252525253FReturnUrl%252525252525252525252525253D%25252525252525252525252525252FMyApplication%25252525252525252525252525252FAccount%25252525252525252525252525252FLogin%25252525252525252525252525253FReturnUrl%25252525252525252525252525253D%2525252525252525252525252525252FMyApplication%2525252525252525252525252525252FAccount%2525252525252525252525252525252FLogin%2525252525252525252525252525253FReturnUrl%2525252525252525252525252525253D%252525252525252525252525252525252FMyApplication%252525252525252525252525252525252F

我从一个可以工作的解决方案(虽然没有角色权限控制)转移到当前破碎的情况,唯一的变化是在成功登录后,我在被重定向到的控制器上方添加了以下内容:
[Authorize(Roles = "Staff")]

如我先前所说,我登录的用户不属于这个角色,但我希望能够合理地单向重定向到登录页面,而不出现循环。

编辑:根据@dima的要求,应用授权的细节是通过过滤器实现的...我有以下内容:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
}

然而,我已经测试了应用程序,带上或不带这行代码也没有效果,重定向循环仍然持续。


你是否创建了一个新的全局过滤器来进行角色认证,或者对用于身份验证/授权的全局过滤器或其他代码或配置进行了更改?如果是这样,请分享! - dima
好的点子 @dima,我会加上的。 - A. Murray
赞你发布了一个“StackOverflow”异常,尽管它是以HTTP“查询字符串太长”的形式出现的。 - Rudi
请看这个和这个链接,希望能对你有所帮助:http://stackoverflow.com/questions/1472496/log-in-loop-asp-net-mvc-view-with-authorize-attribute 和 https://dev59.com/Y3VC5IYBdhLWcg3wnCf6。 - dima
3个回答

12

虽然这个问题已经很旧了,但我遇到了相同的问题并找到了解决方法。

最初,我添加了相同的AuthorizationAttribute过滤器,并发现自己陷入了同样的循环中。 然后我将其去掉,开始向各个控制器添加authorize属性,发现当将授权属性添加到我的主页控制器时才会发生无限循环。原来我的HomeControllerAccountController之后被调用。

问题


在我的_Layout.cshtml中,我调用了以下内容:

@Html.Action("LeftNav", "Home")

布局页面正确呈现主体内容,但在此之后,它触发了一个带有授权属性的控制器方法。这导致重定向到 Account/Login

AllowAnonymous 属性添加到 LeftNav 操作中解决了该问题。

解决方案


确保您的 Login 视图和布局不调用任何具有授权属性的操作。

自从发现这个问题以来,我为我的未经授权请求创建了一个自定义布局,以避免类似于这样的潜在问题。


感谢@silencedmessage发布此内容,这正是我所遇到的情况。我忘记回来更新这个问题了,所以谢谢你提供如此好的解释。 - A. Murray
@A.Murray,我正在使用问题中提供的相同示例,但答案对我不起作用。我已从LoginController中删除了所有与HomeController的连接,以及从LoginControllers_Layout视图的所有连接或导致任何操作进入HomeController的其他连接。显然,初始URL请求是默认的(/Home/Index),但由于应用了AuthorizeAttribute过滤器,它将请求重定向到LoginController的登录页面,在那里正确提供了凭据,但它没有返回到最初请求的URL,而是陷入了URL无限循环。 - Jogi
我对这个修复方案感到无语,绝对是一个惊人的解决方案,为silencedmessage竖起大拇指! - Coding Freak

0

我正在处理与问题中给出的相同示例,但是@silencedmessage标记的答案无法解决我的情况,尽管我断开了Home控制器和Account控制器之间以及Account控制器和_layout视图之间的所有链接。如果有人像我一样面临这种情况,我建议将以下步骤添加到解决方案中:

由于在此示例中应用了全局AuthorizeAttribute,因此默认情况下,所有其操作方法都受到保护,不允许“匿名”访问。在此示例中,[AllowAnnonymous]属性仅应用于[HttpGet]登录操作方法。它未应用于[HttpPost]登录操作方法,由于全局应用了AuthorizeAttribute,因此也保护了[HttpPost]登录操作方法,因此[HttpPost]登录操作方法未执行,您将被无限重定向到[HttpGet]登录操作方法。

通过简单地将[AllowAnnonymous]添加到[HttpPost]登录操作方法中,解决了我的情况。

希望能对你有所帮助。


0

如果有人在使用MVC时,返回登录页面时没有任何错误提示,在使用Visual Studio/IIS Express运行时,请确保项目设置为使用SSL,并在登录时使用https本地主机地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接