如何在.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配置(密码规则、验证逻辑等)完全一致。
- 调整业务类实现
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); // 后续处理创建结果 } } }
- 在主项目Program.cs中注册业务类
// 保留你原本的Identity注册逻辑,之后添加业务类注册即可 builder.Services.AddScoped<B_Manage>();
- 使用时直接注入
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.
相关产品推荐
相关产品推荐

