我来自MVC背景,刚刚开始使用ASP.Net Core。我正在使用身份进行身份验证。
对于授权,我曾经在MVC中使用:
if(User.IsInRole("TestRole"))
在.Net Core中,好像是:
if(await IsInRoleAsync(User,"TestRole"))
从我的初步印象来看,就像MVC用来签入声明一样,就像Core每次从数据库中进行检查一样。我的假设是否正确?每次在Core中调用该方法时都会有一次数据库旅行?
如果每次都在数据库中进行检查,这将不是一项昂贵的操作,并且从索赔检查中有什么好处?
答案 0 :(得分:0)
身份现在依赖于分配给使用中的UserStore<TUser>
的{{1}}的实现。如果使用Entity Framework程序包,则UserManager<TUser>
实现将始终对照数据库进行检查。
您可以创建自己的UserStore<TUser>
并对照UserStore<TUser>
的{{1}}属性进行检查,甚至可以在第一次获得声明后执行某种缓存。由您决定使用什么以及如何缓存/刷新这些值。
请注意,如果尚未检索到Claims,则先前的实现会执行同步数据库调用,因此,值得庆幸的是,现在为Controller.User
。
答案 1 :(得分:-2)
From the Source Code您可以看到它正在使用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>(); } }