我有一个旧的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();
...
}