我有一个受[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");
}
根据数据库,用户担任此角色。为什么这不起作用?我错过了配置或某种类型吗?
答案 0 :(得分:9)
我将回答我自己的问题。
这不起作用的原因(挖掘数小时)是因为我的背景有以下几点:
Configuration.ProxyCreationEnabled = false;
禁用延迟加载,因此加载用户时不包含角色!
所以解决方法是启用此功能或删除该行。
更新时间:2015-05-01
这是一个在2.0.0-alpha1版本中修复的错误。因此,此解决方法不再需要继续,并且无论此设置如何,角色都将加载。
答案 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。你确定你:
答案 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;)应该有一个带有你的角色信息的声明