使用ASP.NET标识的AuthorizeAttribute

时间:2014-01-08 17:09:39

标签: c# asp.net-mvc asp.net-identity asp.net-roles

我有一个受[Authorize]属性保护的控制器。

这非常好(如果我没有登录,我会被发回登录),但是我希望在这个属性中添加一些角色,我已经读过它可能会像[Authorize(Roles = "Customer"]这样做但是当我这样做时,我立即被送回我申请的登录页面?

这个Roles覆盖不适用于新的ASP.NET身份吗?在我的用户创建中,我将用户添加到以下代码:

var user = new ApplicationUser {UserName = model.Username};
var result = UserManager.Create(user, model.Password);
if (result.Succeeded)
{
    UserManager.AddToRole(user.Id, "Customer");
    SignIn(user, false);

    return RedirectToAction("Done");
}

根据数据库,用户担任此角色。为什么这不起作用?我错过了配置或某种类型吗?

5 个答案:

答案 0 :(得分:9)

我将回答我自己的问题。

这不起作用的原因(挖掘数小时)是因为我的背景有以下几点:

Configuration.ProxyCreationEnabled = false;

禁用延迟加载,因此加载用户时不包含角色!

所以解决方法是启用此功能或删除该行。

更新时间:2015-05-01

这是一个在2.0.0-alpha1版本中修复的错误。因此,此解决方法不再需要继续,并且无论此设置如何,角色都将加载。

Does Identity Owin require LazyLoading?

答案 1 :(得分:0)

像这样创建一个角色:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));

然后,像这样添加一个用户:

var currentUser = UserManager.FindByName(user.UserName); 
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");

如果这对你有用,请告诉我。

答案 2 :(得分:0)

在我的案例中,它适用于AspNet Identity。你确定你:

  • 没有自定义授权过滤器或者做得对吗?
  • 还没有在web.config中重新配置身份验证/授权?
  • 在AspNet身份表中有适当的条目:AspNetUsers,AspNetRoles,AspNetUserRoles(角色存在且用户拥有它)?

答案 3 :(得分:0)

查看此答案:ASP.NET Identity check user roles is not working

在您的情况下,在检查案例时,比较IdentityRole记录和授权属性的情况。不要与UserManager.AddToRole(user.Id, "Customer");

进行比较

答案 4 :(得分:0)

我写了一个样本来测试它,它运作良好。所以我认为有2分 1.你的cookie不保存到浏览器
2.你的cookie没有角色信息

检查你的cookie,是否有一个名为“.AspNet.ApplicationCookie”的cookie(默认名称)
如果不是这样检查你broswer允许写cookie,或你写cookie的代码 如果exsit,你可以创建一个类extends

ISecureDataFormat<AuthenticationTicket>  

和配置

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            TicketDataFormat=new T()

        });

新T()是班级 在这堂课你需要做

public string Protect(AuthenticationTicket data)

public AuthenticationTicket Unprotect(string protectedText)

关于序列化的一些事情 你可以设置一个断点,并检查数据,
in data.Identity.Claims(一个IEnumerable&lt; Claim&gt;)应该有一个带有你的角色信息的声明