由于项目中的一些因素,我需要在不使用 DI 的情况下手动创建 UserManager
的实例。我这样做如下:
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);
这是在辅助类中完成的,结果
返回给调用类,我的 Controller 。
在我的 Controller 中,我进行了以下调用:
var user = await _userManager.GetUserAsync(User);
...但是,user
始终为空。我假设我传递给 UserManager
构造函数的一些 nulls
需要填写,但我只是猜测。我实际上是从另一个 SO 问题中获得了这段代码的基础,我现在找不到这些问题。
我不认为我正在做的配置其他一些依赖项有什么神奇之处。我使用了一个名为 ApplicationDbContext
的 DbContext
,它看起来像这样:
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
的调用返回 null
?
编辑和更新
我只是想澄清一下,我确实在整个项目中都在使用 DI,我只是不能将它用于 UserManager
。原因是依赖项通常是通过 .AddIdentity()
调用为它连接的,我们没有在这个项目中使用它。添加默认身份服务胜过我们正在使用的 OIDC 配置,添加我们未使用的中间件并阻止用户正确进行身份验证。
UserManager
确实是普通的 ASP.NET Core 之一。但不同之处在于我们使用 OIDC 来登录用户。
最佳答案
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感谢指出源头,诚然,我应该更频繁地这样做。
关于c# - 满足 ASP.NET Core 中的 UserManager 依赖项需要什么要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174156/