c# - 满足 ASP.NET Core 中的 UserManager 依赖项需要什么要求?

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

由于项目中的一些因素,我需要在不使用 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 问题中获得了这段代码的基础,我现在找不到这些问题。

我不认为我正在做的配置其他一些依赖项有什么神奇之处。我使用了一个名为 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 来登录用户。

最佳答案

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感谢指出源头,诚然,我应该更频繁地这样做。

关于c# - 满足 ASP.NET Core 中的 UserManager 依赖项需要什么要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174156/

相关文章:

c# - 如何使用对话框/提要 javascript 在 Facebook 的描述字段中添加 URL?

c# - .NET Core Web 项目 - 使用命令行参数

c# - 如何使用 LINQ 计算最大组中的对象数?

c# - 从模型 Entity Framework Core 获取上下文的内置方法

entity-framework - 有没有办法将.edmx图从VS2008导出到Visio?

c# - Entity Framework 关系结果Web Api序列化错误

asp.net-core - 如何在 OpenID (MSAL) 身份验证期间访问数据库

unit-testing - 从 TestServer 测试 asp.net 5 vnext 中间件

c# - Membership.ValidateUser 在升级到 VS 2010/.NET 4.0 后总是返回 false

c# - 使 NUnit 在无效测试参数上失败