9

我对在 ASP.NET MVC 5 中实现角色有点束手无策。我正在尝试以不具有访问我要访问的应用程序区域所需角色的用户身份登录。在这种情况下,我所期望的是,我会再次重定向到登录页面,直到我输入一组可以访问的凭据或导航到应用程序的另一个区域。

实际发生的情况是应用程序似乎进入了登录重定向循环,调试显示登录操作被多次调用。

这是登录操作:

[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")]

正如我之前所说,我登录的用户不是这个角色,但我希望一个理智的、单一的重定向到登录,没有循环。

编辑:请求bu @dima,通过过滤器应用的授权细节......我有以下内容:

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

但是,我已经测试了有无这条线的应用程序,并且重定向循环继续有增无减。

4

3 回答 3

12

虽然这个问题很老,但我遇到了同样的问题并找到了解决方案。

最初,我添加了相同的 AuthorizationAttribute 过滤器,并发现自己处于相同的循环中。然后我把它拿走,开始给各个控制器添加授权属性,发现只有在我的家庭控制器添加授权属性时才会发生无限循环。事实证明,HomeController的.AccountController

问题


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

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

布局页面将正确呈现主体,但是当它到达此位置时,它遇到了一个具有授权属性的控制器方法。这导致重定向到Account/Login.

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

解决方案


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

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

于 2014-09-24T13:39:06.503 回答
0

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

由于AuthorizeAttribute在这个例子中是全局应用的,它的所有操作方法默认都是安全的,不允许“匿名”访问。在这个非常示例中,[AllowAnnonymous]属性仅应用于[HttpGet]登录操作方法。它不适用于 [HttpPost] 登录 ActionMethod,并且由于AuthorizeAttribute全局应用,它也保护[HttpPost]登录 ActionMethod,因此[HttpPost]登录 ActionMethod 没有执行,并且您被[HttpGet]无限重定向到登录 ActionMethod。

通过简单地添加[AllowAnnonymous][HttpPost]登录 ActionMethod 解决了我的情况。

希望能帮助到你。

于 2016-01-23T07:28:26.707 回答
0

如果有人遇到问题 MVC 在没有任何错误的情况下返回登录,则在 Visual Studio/IIS Express 中运行时,请确保项目设置为使用 SSL 并在登录时使用 https 本地主机地址。

于 2018-11-12T23:16:44.957 回答