ASP.NET Identity和User.IsInRole

时间:2017-04-28 20:05:27

标签: asp.net-core claims-based-identity asp.net-identity-2

我将项目从成员资格提供程序移动到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不起作用。为什么以及如何解决?

2 个答案:

答案 0 :(得分:0)

声明和角色不同,请参阅herehere。您应该使用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时,您无法在数据库中看到新添加的信息。有办法强迫这一点,但这超出了这个问题。