老实说,我自己仍在学习 Identity。诚然,微软提供的文档可能会更好,但我从来没有发现他们的任何文档都有帮助。最好的东西总是来自社区,不幸的是,Identity 仍然很新,社区还没有时间真正充实它。
也就是说,这就是我所知道的,但我知道可能还有更好的方法,但我根本不知道。
索赔
您的UserManager 具有三种显着性方法:GetClaimsAsync、AddClaimAsync 和RemoveClaimAsync。
获取用户的所有声明:
var claims = await UserManager.GetClaimsAsync(userId);
您可以通过以下方式获取当前用户的 id:
var userId = User.Identity.GetUserId();
获得声明后,提取特定声明:
var someClaim = claims.FirstOrDefault(c => c.Type == "SomeClaimType");
其中“SomeClaimType”是声明添加时的名称。在某些情况下,这可能是一个完全限定的 URN,或者它可能只是一个简单的字符串。如果这不是您亲自添加的,最好的办法就是在调试会话期间检查 claims 变量,看看您实际上有什么。
此外,由于声明列表是可查询的,您几乎可以在其上执行任何您想要的 LINQ 查询,Where、Count 等。
添加新声明:
await UserManager.AddClaimAsync(userId, new Claim("SomeClaimType", claimValue));
并删除声明:
await UserManager.RemoveClaimAsync(userId, someClaim);
角色
角色的工作方式类似。获取用户的所有角色:
var roles = await UserManager.GetRolesAsync(userId);
查看用户是否属于特定角色:
var hasRole = await UserManager.IsInRoleAsync(userId, "SomeRole");
将用户添加到特定角色:
await UserManager.AddToRoleAsync(userId, "SomeRole");
并删除:
await UserManager.RemoveFromRoleAsync(userId, "SomeRole");
首先添加角色有点不同;你必须创建一个RoleStore 的实例。
var roleStore = new RoleStore<IdentityRole>(context);
然后,您可以使用它来管理所有角色。例如,要创建一个新角色:
await roleStore.CreateAsync(new IdentityRole("RoleName"));
删除:
var identityRole = await roleStore.FindByNameAsync("RoleName");
await roleStore.DeleteAsync(identityRole);
目前无法使用特定于身份的 API 获取 所有 角色,但您始终可以退回到直接使用实体框架进行查询:
var allRoles = context.Roles.OrderBy(o => o.Name);