我将项目从成员资格提供程序移动到ASP.NET Identity,我添加了以下角色管理器:
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(RoleStore<ApplicationRole> store)
: base(store)
{ }
public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options,
IOwinContext context)
{
return new ApplicationRoleManager(new
RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
}
}
我尝试将用户添加到角色:
await UserManager.AddClaimAsync("46bf12b9-6b9e-43f9-ad9b-8fff27987978", claim: new Claim(ClaimTypes.Role.ToString(), "Admin"));
添加了记录,但User.IsInRole不起作用。为什么以及如何解决?
答案 0 :(得分:0)
声明和角色不同,请参阅here和here。您应该使用AddToRoleAsync
中包含的方法UserManager<T>
。这是一个例子。
var user = new ApplicationUser
{
Username = "Rob@Microsoft.com",
Email = "Rob@Microsoft.com"
};
var result = await _userManager.CreateAsync(user, "P@ssw0rd");
if (result.Succeeded)
{
await _userManager.AddToRoleAsync(user, "Admin");
}
答案 1 :(得分:0)
最好使用AddToRoleAsync
方法 - 它的功能非常相似,您不必自己动手。此外,如果内部实施发生变化,您将不必更新代码。
至于User.IsInRole
不起作用 - 我怀疑它在你打电话后不能立即发挥作用。但是,如果您将用户注销并再次登录,则您将看到该角色。这是因为User.IsInRole
检查cookie,其中AddClaimAsync
将声明添加到数据库。并且每次调用时都不会从数据库中刷新cookie,因此在查看cookie时,您无法在数据库中看到新添加的信息。有办法强迫这一点,但这超出了这个问题。