Разница между user.isinrole и IsInRoleAsync(пользователь TUser, строковая роль)
Я из MVC и только начал работать над ASP.Net Core. Я использую идентификацию для аутентификации.
Для авторизации в MVC я использовал:
if(User.IsInRole("TestRole"))
В.Net Core это выглядит так:
if(await IsInRoleAsync(User,"TestRole"))
Исходя из моих первоначальных впечатлений, похоже, что MVC использовался для проверки заявок, когда Core проверяет базу данных каждый раз. Правильно ли я в своем предположении и что каждый раз, когда метод вызывается в Core, происходит отключение БД?
Если он проверяет данные из БД каждый раз, не будет ли это дорогостоящей операцией и чем это выгодно при проверке претензий?
2 ответа
Идентичность теперь зависит от реализации UserStore<TUser>
назначен на UserManager<TUser>
в использовании. Если вы используете пакет Entity Framework, UserStore<TUser>
реализация всегда сверяется с базой данных.
Вы можете создать свой собственный UserStore<TUser>
и проверить против Controller.User
"s Claims
собственности или даже выполнить какое-то кэширование после получения претензий в первый раз. Вам решать, что вы используете и как вы кэшируете / обновляете эти значения.
Обратите внимание, что предыдущие реализации выполняли синхронный вызов базы данных, если заявки еще не были получены, поэтому вы должны быть благодарны, что сейчас IsInRoleAsync
,
Из исходного кода вы можете видеть, что он использует DbSet
public TContext Context { get; private set; }
private DbSet<TUser> UsersSet { get { return Context.Set<TUser>(); } }
private DbSet<TRole> Roles { get { return Context.Set<TRole>(); } }
private DbSet<TUserClaim> UserClaims { get { return Context.Set<TUserClaim>(); } }
private DbSet<TUserRole> UserRoles { get { return Context.Set<TUserRole>(); } }
private DbSet<TUserLogin> UserLogins { get { return Context.Set<TUserLogin>(); } }
private DbSet<TUserToken> UserTokens { get { return Context.Set<TUserToken>(); } }