Ну, вы можете использовать Claims
, конечно, но есть некоторые другие вещи (и проще), чтобы получить текущие роли пользователей.
Первый должен использовать класс UserManager<TUser>
, который является экземпляром интерфейса IUserManager<TUser>
. Когда вы создаете проект по умолчанию, он хранится как свойство в ваших контроллерах. В этом классе много полезных методов для работы с самими учетными записями пользователей (создание, редактирование, удаление) и с ролью пользователя (назначить, переназначить и получить их). Кроме того, с помощью этого менеджера вы можете быть 1000% уверены, что если кто-то изменили роли пользователя 1 секунду назад вы получите соответствующие роли пользователей всегда
Второй заключается в использовании встроенного IsInRole(string role)
метода собственности User
контроллеров. Он возвращает true, если в настоящее время зарегистрированный пользователь указал роль или false, если нет. Этот подход немного «неустойчив», поскольку он использует данные User
, который является экземпляром IPrincipal
и назначается, когда ваш пользователь входит в систему. Изменение текущих пользовательских ролей, если он в настоящее время вошел в систему, может иметь место только после того, как вы дадите этот пользователь с выходом из системы, а затем снова войдите в него. Это связано с тем, что вам нужно переназначить экземпляр экземпляра IdentityUser
на текущий IPrincipal
. Более того, это справедливо и для Claims
массива ClaimsIdentity
. Но если вы уверены, что это невозможно в вашей системе, вы можете забыть об этом.
Кроме того, если вы ваши роли определены в ролях перечисления его лучше, чтобы создать свой собственный метод расширения для User
, который будет принимать ваши роли значения перечисления вместо вызова ToString()
при каждом вызове, построенных в IsInRole()
:
public static bool IsInRole(this IPrincipal principal, RolesEnum value)
{
return principal.IsInRole(value.ToString());
}
Также вы можете создать свои собственные вспомогательные методы таким же образом, чтобы проверить свои роли, если хотите.
Если вы предпочитаете использовать LINQ
запрос просто заменить выражение Where
с этим:
.Where(c => c.Type == ClaimTypes.Role && c.Value.StartsWith(startValeu) && c.Value.EndsWith(endValue))
'StartsWith и EndsWith' – MethodMan
Спасибо, я все еще учусь, как я реализовать их? @MethodMan –
var role = ((ClaimsIdentity) User.Identity) .Claims .Where (c => c.Type == ClaimTypes.Role && c.Value.StartsWith ("Club") && c.Value.EndsWith (" Admin ")) .Выберите (c => c.Стоимость); – lyz