我正试图摆脱WebForms并学习MVC,特别是使用新的ASP.NET Identity模型。然而,我似乎找不到来自Microsoft的任何正式文档,演示如何创建声明对象,并将其存储在数据库中以进行身份验证。
我的网站需要执行以下操作:
- 验证用户 - 已完成
- 创建声明,并在其中存储用户信息,以便我可以在整个会话期间使用它 - 未完成
- 从新的ASP.NET角色表中检索用户角色 - 未完成
有人能否解释如何实现这一点?
我正试图摆脱WebForms并学习MVC,特别是使用新的ASP.NET Identity模型。然而,我似乎找不到来自Microsoft的任何正式文档,演示如何创建声明对象,并将其存储在数据库中以进行身份验证。
我的网站需要执行以下操作:
有人能否解释如何实现这一点?
说实话,我自己对身份验证还在学习过程中。诚然,微软提供的文档可能会更好一些,但我从来没有发现他们的任何文档真正有用。最好的资料总是来自社区,不幸的是,身份验证仍然很新,因此社区尚未真正完善它。
话虽如此,以下是我所知道的,理解其中可能还有更好的方法,只是我还不知道而已。
您的 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不可能获取所有角色,但您始终可以回退到直接使用Entity Framework查询:
var allRoles = context.Roles.OrderBy(o => o.Name);