由于项目中的许多因素,我需要手动创建UserManager
的实例,而不使用DI。我这样做如下:
var userstore = new UserStore<ApplicationUser>(_userContext);
IPasswordHasher<ApplicationUser> hasher = new PasswordHasher<ApplicationUser>();
var validator = new UserValidator<ApplicationUser>();
var validators = new List<UserValidator<ApplicationUser>> { validator };
var result = new UserManager<ApplicationUser>(userstore, null, hasher, validators, null, null, null, null, _userLogger);
这是在一个帮助器类中完成的,result
将返回给调用类,即我的控制器。
在我的控制器中,我拨打以下电话:
var user = await _userManager.GetUserAsync(User);
...但是,user
始终为空。我假设我传入nulls
构造函数的UserManager
中的一些需要填写,但我只是在猜测。实际上我从另一个SO问题得到了这个代码的基础,我现在无法找到它。
我认为我正在做的事情中没有任何魔法可以配置其他一些依赖项。我使用名为DbContext
的{{1}}看起来像这样:
ApplicationDbContext
我在public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
中将其连接起来:
Startup.cs
我有一个来自共享项目的 services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("IdentityConnection")));
。
当我这样做时:
AppliactionUser
我得到了所有预期用户的列表。
为什么拨打var users = userManager.Users.ToList();
的电话会回复GetUserAsync
?
编辑&amp;更新
我只是想澄清我确实在整个项目中使用了DI,我只是不能将它用于null
。原因是依赖关系通常通过UserManager
调用连接到它,我们在这个项目中没有使用它。添加默认身份服务胜过我们正在使用的OIDC配置,添加我们未使用的中间件并阻止用户正确进行身份验证。
.AddIdentity()
确实是正常的ASP.NET核心版本。但不同之处在于我们正在使用OIDC来记录用户。
答案 0 :(得分:1)
ApplicationUser
作为null
被返回,因为经过身份验证的用户没有预期的声明。 UserManager
已正确连接,保存配置更改,允许用户通过不同命名的声明解析。
我们使用IdentityServer 4作为项目的后备身份提供程序。标识用户的声明类型称为sub
,UserManager
通常不会对其进行检查。
最后,我创建了一个快速类(我可能能够重构为内联的东西),看起来像这样:
public class OptionsProvider : IOptions<IdentityOptions>
{
public IdentityOptions Value { get
{
var result = new IdentityOptions();
result.ClaimsIdentity = new ClaimsIdentityOptions { UserIdClaimType = "sub" };
return result;
}
}
}
接下来,我更新了UserManager
的实例化以包含选项:
var result = new UserManager<ApplicationUser>(
userstore,
new OptionsProvider(),
hasher,
validators,
null, null, null, null,
_userLogger);
这就是诀窍。再次感谢@trailmax指出我的来源,我应该更频繁地做一些。