【发布时间】:2018-01-09 18:00:35
【问题描述】:
由于项目中的许多因素,我需要手动创建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 始终为空。我假设我传递给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 来登录用户。
【问题讨论】:
-
这是 AspNet Identity 的标准
UserManager吗?我在问,因为我在 MSDN 上看到的唯一构造函数是UserManager<TUser, TKey>(IUserStore<TUser, TKey>),它只有一个参数,并且有 2 个泛型类型,而不仅仅是 1 个。 -
您是如何在您的第一个代码 sn-p 中获得
_userContext的?此外,您可以提及为什么不能使用 DI -
@BradleyUffner this 怎么样
-
只有source code会告诉你真相
-
@trailmax 感谢您提示我这样做,我陷入了困境,它引导我找到了解决方案。
标签: c# entity-framework asp.net-core asp.net-identity