防止通过AddClaimAsync添加重复声明

时间:2018-05-14 14:39:43

标签: c# asp.net asp.net-mvc authentication claims-based-identity

我们在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然后运行该方法。感谢。

0 个答案:

没有答案