在ASP.NET Core中满足UserManager依赖性需要哪些要求?

时间:2018-01-09 18:00:35

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

由于项目中的许多因素,我需要手动创建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来记录用户。

1 个答案:

答案 0 :(得分: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指出我的来源,我应该更频繁地做一些。