【问题标题】:What requirements are needed to satisfy UserManager dependencies in ASP.NET Core?满足 ASP.NET Core 中的 UserManager 依赖项需要哪些要求?
【发布时间】: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 问题中获得了此代码的基础。

我不认为我在配置其他一些依赖项方面有什么神奇之处。我使用了一个名为ApplicationDbContextDbContext,看起来像这样:

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&lt;TUser, TKey&gt;(IUserStore&lt;TUser, TKey&gt;),它只有一个参数,并且有 2 个泛型类型,而不仅仅是 1 个。
  • 您是如何在您的第一个代码 sn-p 中获得_userContext 的?此外,您可以提及为什么不能使用 DI
  • @BradleyUffner this 怎么样
  • 只有source code会告诉你真相
  • @trailmax 感谢您提示我这样做,我陷入了困境,它引导我找到了解决方案。

标签: c# entity-framework asp.net-core asp.net-identity


【解决方案1】:

ApplicationUser 被返回为 null,因为经过身份验证的用户上不存在预期的声明。 UserManager 连接正确,保存配置更改,允许用户通过不同名称的声明来解决。

我们使用 IdentityServer 4 作为项目的支持身份提供者。标识用户的声明类型称为subUserManager 通常不会对其进行检查。

最后,我创建了一个如下所示的快速类(我可能能够将其重构为内联的东西):

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 指出我的来源,诚然,我应该经常这样做。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2020-03-06
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多