3

我有一个使用 Microsoft.AspNetCore.Identity.UserManager 来管理用户的应用程序。我使用核心 2.2。UserManager 是通过我的服务中的内置依赖注入(不是我)注入的。像这样:

public MyService(UserManager<IdentityUser> userManager)
{
   _userManager = userManager;
}

当我第一次尝试通过 Id (FindByIdAsync) 获取用户时,我在控制台中看到对 db 的请求。具有相同 ID 的下一个请求我没有看到对 db 的任何请求,但应用程序工作并获得了用户。

在 Startup.cs 我没有 userManager 的配置。我只是使用扩展方法:

public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                Configuration.GetConnectionString("MyConnectionString"));
            services
                .AddIdentity<IdentityUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
            services.AddMvc();
            var configService = new ConfigurationService(Configuration);
            services
                .AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryApiResources(configService.GetApiResources())
                .AddInMemoryClients(configService.GetClients())
                .AddTestUsers(configService.GetUsers());
        }

问题:也许有一种方法可以在 UserManager 中配置此缓存功能?指出从哪里获取有关此缓存保留多长时间的信息。

4

1 回答 1

4

我在 Github 上挖掘了 Identity 源代码,结果UserStore如下:

public override Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
    cancellationToken.ThrowIfCancellationRequested();
    ThrowIfDisposed();
    var id = ConvertIdFromString(userId);
    return UsersSet.FindAsync(new object[] { id }, cancellationToken);
}

UsersSet类型的蜜蜂DbSet<TUser>,身份无法直接管理缓存,而是依赖于 EF 内部。

深入研究 EF 源代码,我以DbContext

object IDbSetCache.GetOrAddSet(IDbSetSource source, Type type)
{
    CheckDisposed();

    if (_sets == null)
    {
        _sets = new Dictionary<Type, object>();
    }

    if (!_sets.TryGetValue(type, out var set))
    {
        set = source.Create(this, type);
        _sets[type] = set;
    }

    return set;
}

看起来有一个由简单明了的缓存机制支持的缓存机制Dictionary

然而,正如 Matt G. 在他的评论中指出的那样,管理缓存的解决方案位于您的服务之上:它与您在注入UserManager.

于 2019-03-26T14:56:30.247 回答