Мы используем ASP.NET Identity в приложении MVC 5. У нас есть страница, которая позволяет пользователям и их претензиям быть добавленными администратором. Тем не менее, используя следующие строки, я могу продолжать добавлять пользователя с той же заявкой роли, создавая таким образом повторяющиеся элементы (таблица 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
для этого пользователя и затем запустить метод. Спасибо.