Разница между 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>(); } }
Другие вопросы по тегам