我有一个较旧的asp.net核心身份数据库,我想将一个新项目(一个web api)映射到它。
仅仅为了测试,我复制了Models文件夹,以及上一个项目中的ApplicationUser文件(ApplicationUser只是继承自IdentityUser,没有任何变化) - 首先执行数据库似乎是一个坏主意。
我在ConfigureServices中注册了身份(但我没有将它添加到管道中,因为我的唯一目的是使用UserStore)
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
我的期望是现在
UserManager<ApplicationUser>
...应该自动注入构造函数。
但是,将以下代码添加到控制器时 private UserManager _userManager;
public UserController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
...对api的每次调用都以异常结束: HttpRequestException:响应状态代码不表示成功:500(内部服务器错误)。
删除&#34;注射&#34;代码可以顺利运行可以接受请求的web api。
在我的任何代码到达之前发生这种情况很难调试。知道为什么会这样吗?
P.S。从“异常设置”窗口启用所有异常后,我得到了这个:
抛出异常:&#39; System.InvalidOperationException&#39;在
Microsoft.Extensions.DependencyInjection.dll其他信息:无法解析类型服务 &#39; Namespace.Data.ApplicationDbContext&#39;在尝试激活时 &#39; Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models。 ApplicationUser,Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole,Namespace.Data.ApplicationDbContext,System.String]&#39;
答案 0 :(得分:7)
您是否使用app.UseIdentity();
方法进行Configure
调用:
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
。
答案 1 :(得分:4)
DI容器无法解析依赖项。将其添加到服务集合
services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();
您还应该熟悉official documentation
答案 2 :(得分:0)
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();
...
}