我们在MVC 5应用程序中使用ASP.NET Identity。我们有一个页面,允许管理员添加用户及其声明。但是,使用以下行,我可以继续添加具有相同角色声明的用户,从而创建重复项(AspNetUserClaims
表具有主键的“自动编号”列,因此我们可以继续添加相同的角色同一个用户):
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
await userManager.AddClaimAsync("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
new Claim(ClaimTypes.Role, "SomeRole"));
请注意,我正在为任意用户添加声明,而不是登录用户。如果是登录用户,我只需拨打User.IsInRole("SomeRole")
即可。而xxxx
是用户的GUID。
在这种情况下,我想在添加角色之前使用以下数据库调用进行检查:
public static async Task<bool> UserHasClaim(string userId,
string claimType, string claimValue)
{
using (var db = new MyEntities())
{
return await db.AspNetUserClaims
.AnyAsync(x => x.UserId == userId && x.ClaimType ==
claimType && x.ClaimValue == claimValue);
}
}
有更好的方法吗?我知道ClaimsPrincipal
包含方法.HasClaim(...)
,但我无法弄清楚如何从该用户创建ClaimsPrincipal
然后运行该方法。感谢。