You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET类库中为Blazor项目创建Microsoft Identity的UserManager实例

类库中实例化Identity UserManager/RoleManager的解决方案

问题原因

你看到的仅传入store参数即可实例化UserManager的示例属于ASP.NET Framework版本的Identity实现。.NET Core/.NET 5+ 版本的Identity重构了UserManager、RoleManager的构造函数,要求注入全部依赖项,因此无法仅通过store参数完成实例化。

推荐方案:通过依赖注入获取实例(符合.NET Core架构规范)

无需手动构造管理器实例,利用.NET Core自带的依赖注入容器自动注入已经在主项目配置好的Identity服务即可,既不需要处理复杂的构造参数,也能保证和主项目的Identity配置(密码规则、验证逻辑等)完全一致。

  1. 调整业务类实现
namespace Business
{
    public class B_Manage
    {
        private readonly UserManager<IdentityUser> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;

        // 构造函数声明依赖,DI容器会自动传入已注册的实例
        public B_Manage(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            _userManager = userManager;
            _roleManager = roleManager;
        }

        public async Task CreateUserAsync(string userName, string password)
        {
            var newUser = new IdentityUser(userName);
            var createResult = await _userManager.CreateAsync(newUser, password);
            // 后续处理创建结果
        }
    }
}
  1. 在主项目Program.cs中注册业务类
// 保留你原本的Identity注册逻辑,之后添加业务类注册即可
builder.Services.AddScoped<B_Manage>();
  1. 使用时直接注入B_Manage即可,无需手动处理Identity管理器的构造逻辑。

备选方案:手动构造实例(不推荐)

如果你的场景必须手动实例化管理器,可以参考以下写法,按需传入对应参数,不需要的服务可传入null:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.Extensions.Options;

namespace Business
{
    public static class B_Manage
    {
        public static void CreateUser()
        {
            using (var IdentityDB = new IDBContext())
            {
                // 构造RoleManager
                var roleStore = new RoleStore<IdentityRole>(IdentityDB);
                var roleManager = new RoleManager<IdentityRole>(roleStore, 
                    new IRoleValidator<IdentityRole>[] { new RoleValidator<IdentityRole>() },
                    UpperInvariantLookupNormalizer.Instance,
                    new IdentityErrorDescriber(),
                    null);

                // 构造UserManager
                var userStore = new UserStore<IdentityUser>(IdentityDB);
                var userManager = new UserManager<IdentityUser>(userStore,
                    Options.Create(new IdentityOptions()),
                    new PasswordHasher<IdentityUser>(),
                    new IUserValidator<IdentityUser>[] { new UserValidator<IdentityUser>() },
                    new IPasswordValidator<IdentityUser>[] { new PasswordValidator<IdentityUser>() },
                    UpperInvariantLookupNormalizer.Instance,
                    new IdentityErrorDescriber(),
                    null,
                    null);
                
                // 后续操作逻辑
            }
        }
    } 
}

注意:手动构造的实例默认使用基础Identity配置,和你主项目中自定义的Identity规则(如密码长度、是否需要邮箱验证等)不会同步,容易出现逻辑不一致的问题,非特殊场景不建议使用该方案。

内容的提问来源于stack exchange,提问作者Steven Gazo M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:57:03