ASP.NET 核心标识不注入用户管理器<ApplicationUser>



我有一个旧的asp.net核心身份数据库,我想将一个新项目(一个web api)映射到它

只是为了测试,我从上一个项目中复制了Models文件夹和ApplicationUser文件(ApplicationUser只是从IdentityUser继承,没有任何更改)——首先做DB似乎是个坏主意。

我正在ConfigureServices中注册Identity(但我不会将其添加到管道中,因为我的唯一意图是使用UserStore)

services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

我的期望是现在

UserManager<ApplicationUser>

应该自动注入构造函数。

但是,当将以下代码添加到控制器时private UserManager _UserManager;

public UserController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}

对api的每次调用都以一个异常结束:HttpRequestException:响应状态代码未指示成功:500(内部服务器错误)。

删除"注入"代码可以使可以接受请求的web api顺利运行。

很难调试,因为在到达我的任何代码之前都会发生这种情况。知道为什么会发生这种情况吗?

附言:在从"异常设置"窗口启用所有异常后,我得到了这个:

引发异常:
Microsoft.Extensions.DependencyInjection.dll 中的"System.InvalidOperationException">

附加信息:无法解析类型的服务尝试激活时出现"Namespace.Data.ApplicationDbContext"'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4[Namespace.Models。ApplicationUser,Microsoft.AspNetCore.Identity。EntityFrameworkCore.IdentityRole,Namespace.Data.ApplicationDbContext,System.String]'.

Configure方法中有app.UseIdentity();调用吗:

public void Configure(IApplicationBuilder app, 
IHostingEnvironment env, ILoggerFactory loggerFactory)
{
/*...*/
app.UseIdentity();
/*...*/          
}

编辑services.AddIdentity<ApplicationUser, IdentityRole>()行之前也有这行吗?

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

这应该可以正常工作。此外,请检查ApplicationDbContext是否继承自IdentityDbContext

DI容器无法解析依赖项。将其添加到服务集合

services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();

您还应该熟悉的官方文档

public void ConfigureServices(IServiceCollection services){
...
var identityBuilder = services.AddIdentityCore<ApplicationUser>(user =>
{
// configure identity options
user.Password.RequireDigit = true;
user.Password.RequireLowercase = false;
user.Password.RequireUppercase = false;
user.Password.RequireNonAlphanumeric = false;
user.Password.RequiredLength = 6;
});
identityBuilder = new IdentityBuilder(identityBuilder.UserType, typeof(IdentityRole), identityBuilder.Services);
identityBuilder.AddEntityFrameworkStores<DbContext>().AddDefaultTokenProviders();
...
}

相关内容

  • 没有找到相关文章

最新更新