c# - Asp.Net Core 2.1 Identity - UserStore 依赖注入
问题描述
我正在尝试UserStore
为我的身份模型实现自定义;但是,我在应用程序启动时收到此运行时错误:
InvalidOperationException:尝试激活“[Project].Models.Identity.ApplicationUserManager”时,无法解析“[Project].Models.Identity.ApplicationUserStore”类型的服务。
堆:
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(类型 serviceType,类型 implementationType,CallSiteChain callSiteChain,ParameterInfo[] 参数,bool throwIfCallSiteNotFound) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(类型 serviceType,类型 implementationType,CallSiteChain callSiteChain) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor 描述符,类型 serviceType,CallSiteChain callSiteChain)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(类型 serviceType,CallSiteChain callSiteChain)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite (类型 serviceType,CallSiteChain callSiteChain)微软。Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor(Type serviceType) System.Collections.Concurrent.ConcurrentDictionary.GetOrAdd(TKey key, Func valueFactory) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions .DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) Microsoft.AspNetCore.Identity.IdentityBuilder+<>c__DisplayClass22_0.b__0(IServiceProvider services) Microsoft.Extensions.DependencyInjection。 ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,ServiceProviderEngineScope 范围)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSite(IServiceCallSite callSite,TArgument 参数)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProviderEngineScope 范围)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSite (IServiceCallSite callSite, TArgument 参数) Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine+<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope 范围) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup .ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired) lambda_method(Closure, IServiceProvider, object[]) Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider+<> c__DisplayClass4_0.b__0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider+<>c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state , ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker。InvokeNextResourceFilter() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore。 Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft。 AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)Rethrow(ResourceExecutedContext context) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore。 Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) Microsoft。 AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)Rethrow(ResourceExecutedContext context) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore。 Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) Microsoft。 AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware。调用(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware。调用(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)
我的UserStore
实现:
public class ApplicationUserStore : IUserStore<Employee>,
IUserClaimStore<Employee>,
IUserLoginStore<Employee>,
IUserRoleStore<Employee>,
IUserPasswordStore<Employee>,
IUserSecurityStampStore<Employee>
{
#region Constructor signatures I tried for dependency injection
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null)
{
}
public ApplicationUserStore(ApplicationDbContext context)
{
}
public ApplicationUserStore()
{
}
public ApplicationUserStore(DbContext context)
{
}
#endregion
...
我的UserManager
实现:
public class ApplicationUserManager : UserManager<Employee>
{
public ApplicationUserManager(ApplicationUserStore store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<Employee> passwordHasher, IEnumerable<IUserValidator<Employee>> userValidators, IEnumerable<IPasswordValidator<Employee>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<Employee>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
}
我的SignInManager
实现:
public class ApplicationSignInManager : SignInManager<Employee>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<Employee> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<Employee>> logger, IAuthenticationSchemeProvider schemes)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
}
并且,在Startup.ConfigureServices
:
...
services.AddIdentityCore<Employee>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddUserStore<ApplicationUserStore>()
.AddUserManager<ApplicationUserManager>()
.AddSignInManager<ApplicationSignInManager>()
.AddDefaultTokenProviders();
services.AddTransient<IUserStore<Employee>, ApplicationUserStore>();
...
我需要知道是什么导致了问题,如何解决它,以及是否在任何地方都有关于 Asp.Net Core 2.1 依赖注入激活器签名的文档。
解决方案
在查看了此处和此处的开源实现之后,我想出了可能是什么问题的线索——我猜对了。UserStore
需要通过以下行注册Startup.ConfigureServices
:
services.AddScoped<ApplicationUserStore>();
所以,我的最终方法是:
...
services.AddIdentityCore<Employee>()
.AddUserManager<ApplicationUserManager>()
.AddSignInManager<ApplicationSignInManager>()
.AddDefaultTokenProviders();
services.AddScoped<IUserStore<Employee>, ApplicationUserStore>();
services.AddScoped<ApplicationUserStore>();
...
尽管如此,它在没有:
services.AddScoped<IUserStore<Employee>, ApplicationUserStore>();
推荐阅读
- python - 我们可以使用包含标签图像的 caltech101 数据集检测图像中的多个对象吗?
- python-3.x - 如何访问从 kaggle 下载到 Colaboratory notebook 的文件?
- asp.net-mvc - 将 Sitecore 项目 ID 从控制器传递给模型
- php - 如何通过 ajax 将 jQuery 变量发布到外部 PHP SQL 脚本并返回值
- java - Spring for Apache Kafka:无法识别的生产者配置 - 'delivery.timeout.ms'
- sql - 如何在 SQL 中使用正则表达式以及 ~ 是什么意思
- c# - .netcore 中没有 system.drawing?该怎么办?
- c++ - 在 64 位 Ubuntu (18.04) 系统上运行 32 位可执行文件时,如何修复 ld-linux.so.2 中的 gdb 挂起?
- firebase - “Firebase Auth”自定义声明最终是否一致?
- javascript - 如何根据道具更改我的班级渲染?