3

在我们的 MVC 应用程序中,我们绕过 RolesProvider,而只是将我们的角色缓存在将被传递的 cookie 中。根据互联网上的一些建议,我们正在利用该Application_AuthenticateRequest事件,如下所示:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        var user = HttpContext.Current.User;
        if (user == null || !user.Identity.IsAuthenticated)
        {
            return;
        }

        // read the roles from the cookie and set a custom generic principal
        var fi = (FormsIdentity)HttpContext.Current.User.Identity;
        var httpCookie = HttpContext.Current.Request.Cookies["Roles"]; // custom cookie set during authentication
        if (httpCookie != null)
        {
            string rolesCookie = httpCookie.Value;
            var pmUserRoles = rolesCookie.Split(',');
            GenericPrincipal gp = new GenericPrincipal(fi, pmUserRoles);
            HttpContext.Current.User = gp;
        }
    }

我逐步完成了该方法,并在我们的一些角色中加入了几个条件,并且在设置当前用户后立即User.IsInRole("rolename")工作,就像一个魅力。

但是,当尝试在视图中进行相同的调用时:

@if(Request.IsAuthenticated)
{
    if (User.IsInRole("role1") || User.IsInRole("role2"))
    {
        <!-- show something -->
    }
    else if (User.IsInRole("role3"))
    {
        <!-- show something else -->
    }
}

无法访问角色。当我此时深入研究用户时,看起来角色甚至不存在,就在我确认用户在AuthenticateRequest事件结束时拥有它们之后。

这个问题有类似的问题,我打算在那里发表评论,但我想我不能因为我的低代表 - 但看起来这不仅仅是我的问题。

我还查看了具有类似方法的这个问题,但这给了我相同的结果。

对正在发生的事情有任何建议或意见吗?

4

2 回答 2

3

我终于找到了答案,使用Application_OnPostAuthenticateRequest处理程序而不是Application_AuthenticateRequest.

感谢这个答案(令人惊讶的是,这不是该线程中接受的答案!)。感谢蒂亚戈·马蒂亚斯!

于 2012-10-26T16:23:40.373 回答
1

尝试HttpContext.Current.User.IsInRole代替User.IsInRole.

于 2012-10-26T15:02:36.590 回答