这是使用带有身份和实体框架核心的asp.net核心。我在saas应用程序上工作,我有一个单独的管理Web应用程序,您可以在其中添加新的租户到系统。创建租户后,应用程序会为新租户创建默认数据库(每个租户设置的数据库)。我想在这个新数据库中添加一个默认用户,但我很难在依赖注入系统之外创建用户管理器。
管理员网络应用程序使用在startup.cs中创建的用户管理器(通过内置的DI系统)作为管理员应用程序的管理器。当我将用户添加到新租户数据库时,我没有使用DI系统,我只想创建一个UserManager,其IdentityDbContext与新租户数据库的连接字符串相关联。
我在管理员应用中创建新租户后使用此功能:
public class TenantDbInitializer
{
private Tenant tenant;
private ApplicationDbContext context;
private UserManager<ApplicationUser> userManager;
public TenantDbInitializer(Tenant tenant)
{
this.tenant = tenant;
}
public void Init()
{
// tenant contains connection string
context = new ApplicationDbContext(tenant);
var userStore = new UserStore<ApplicationUser>(context);
userManager = new UserManager<ApplicationUser>(.........
}
}
UserManager构造参数包含我无法找到应该使用的实例示例的项目。一些接口似乎具有默认实现,但我不确定这是否是继续(或传递null)的方式。构造函数是:
public UserManager(IUserStore<TUser> store,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<TUser> passwordHasher,
IEnumerable<IUserValidator<TUser>> userValidators,
IEnumerable<IPasswordValidator<TUser>> passwordValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<UserManager<TUser>> logger)
查看身份来源,似乎我可以为其中一些参数传递null,但我想确保我理解这里发生了什么,所以我不会做错任何事情。
用户管理器的来源是: https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNetCore.Identity/UserManager.cs
谢谢, 布赖恩
答案 0 :(得分:6)
查看标识源后,您可以传入空值以获得正确的结果。应该先试试这个。
答案 1 :(得分:0)
我认为您应该至少拥有UserStore:
UserStore<ApplicationUser> _userStore = new UserStore<ApplicationUser>(context, null);
Mock<ILogger<UserManager<ApplicationUser>>> mockLogger = null;
mockLogger = new Mock<ILogger<UserManager<ApplicationUser>>>();
我嘲笑记录器。
答案 2 :(得分:0)
以这种方式解决问题
static IUserStore<ApplicationUser> _store = new UserStore<ApplicationUser>(new context());
static UserManager<ApplicationUser> _userManager = new UserManager<ApplicationUser>(_store, null, new PasswordHasher<ApplicationUser>(), null, null, null, null, null, null);