user.isinrole和IsInRoleAsync(TUser用户,字符串角色)之间的区别

时间:2019-01-30 22:15:36

标签: c# asp.net-mvc asp.net-core asp.net-core-identity

我来自MVC背景,刚刚开始使用ASP.Net Core。我正在使用身份进行身份验证。

对于授权,我曾经在MVC中使用:

if(User.IsInRole("TestRole"))

在.Net Core中,好像是:

if(await IsInRoleAsync(User,"TestRole"))

从我的初步印象来看,就像MVC用来签入声明一样,就像Core每次从数据库中进行检查一样。我的假设是否正确?每次在Core中调用该方法时都会有一次数据库旅行?

如果每次都在数据库中进行检查,这将不是一项昂贵的操作,并且从索赔检查中有什么好处?

2 个答案:

答案 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>(); } }