使用依赖项注入时未注册IUserTokenProvider

编程入门 行业动态 更新时间:2024-10-27 22:31:46
本文介绍了使用依赖项注入时未注册IUserTokenProvider的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

调用GeneratePasswordResetTokenAsync()方法时出现错误.我为autofac配置了owin身份.

I got an error when my GeneratePasswordResetTokenAsync() method is call. I configured autofac with owin identity.

错误是:

使用依赖项注入时未注册IUserTokenProvider

No IUserTokenProvider is registered when using dependency injection

在我的sample.web项目中,有一个AutofacConfig.cs文件,我在其中注册了在sample.repository项目中创建的signinmanager和usermanager.

In my sample.web project there is a AutofacConfig.cs file where I register signinmanager and usermanager which I created in sample.repository project.

AutofacConfig.cs

public class AutofacConfig { public static Autofac.IContainer RegisterDependencies() { var containerBuilder = new ContainerBuilder(); // REGISTER DEPENDENCIES containerBuilder.RegisterType<SampleDataContext>() .As<DbContext>() .InstancePerDependency(); containerBuilder.RegisterType<UserStore<SampleUser>>() .As<IUserStore<SampleUser>>() .InstancePerRequest(); containerBuilder.RegisterType<ApplicationUserManager>() .AsSelf() .InstancePerRequest(); containerBuilder.RegisterType<ApplicationSignInManager>() .AsSelf() .InstancePerRequest(); containerBuilder.RegisterType<EmailService>(); containerBuilder.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication) .InstancePerRequest(); var container = containerBuilder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); var resolver = new AutofacWebApiDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = resolver; return container; } }

ApplicationUserManager.cs

public class ApplicationUserManager : UserManager<SampleUser> { public ApplicationUserManager(IUserStore<SampleUser> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<SampleUser>(context.Get<SampleDataContext>())); // Configure validation logic for usernames manager.UserValidator = new UserValidator<SampleUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 8, RequireNonLetterOrDigit = false, RequireDigit = false, RequireLowercase = false, RequireUppercase = false, }; // Configure user lockout defaults manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5; // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user // You can write your own provider and plug it in here. manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<SampleUser> { MessageFormat = "Your security code is {0}" }); manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<SampleUser> { Subject = "Security Code", BodyFormat = "Your security code is {0}" }); manager.EmailService = new EmailService(); manager.SmsService = new SmsService(); var provider = new DpapiDataProtectionProvider("Sample"); manager.UserTokenProvider = new DataProtectorTokenProvider<SampleUser>( provider.Create("ASP.NET Identity")); return manager; } }

推荐答案

删除ApplicationUserManager.cs类中的create()方法,并将该代码添加到ApplicationUserManager类的构造函数中.

Remove create() method in ApplicationUserManager.cs class and add that code in ApplicationUserManager class's constructor.

ApplicationUserManager.cs

ApplicationUserManager.cs

public class ApplicationUserManager : UserManager<SampleUser> { public ApplicationUserManager(IUserStore<SampleUser> store, IDataProtectionProvider dataProtectionProvider) : base(store) { // Configure validation logic for usernames this.UserValidator = new UserValidator<SampleUser>(this) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords this.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = false, RequireDigit = false, RequireLowercase = false, RequireUppercase = false, }; // Configure user lockout defaults this.UserLockoutEnabledByDefault = true; this.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); this.MaxFailedAccessAttemptsBeforeLockout = 5; // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user // You can write your own provider and plug it in here. this.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<SampleUser> { MessageFormat = "Your security code is {0}" }); this.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<SampleUser> { Subject = "Security Code", BodyFormat = "Your security code is {0}" }); this.EmailService = new EmailService(); this.SmsService = new SmsService(); // var dataProtectionProvider = Startup.DataProtectionProvider; if (dataProtectionProvider != null) { IDataProtector dataProtector = dataProtectionProvider.Create("ASP.NET Identity"); this.UserTokenProvider = new DataProtectorTokenProvider<SampleUser>(dataProtector); } } }

在AutofacConfig.cs文件中注册DataProtectionProvider

register DataProtectionProvider in AutofacConfig.cs file

containerBuilder.Register<IDataProtectionProvider>(c => Startup.DataProtectionProvider).InstancePerRequest();

在Startup.cs类中解析ApplicationUSerManager类

Resolve ApplicationUSerManager class in Startup.cs class

public partial class Startup { public static IDataProtectionProvider DataProtectionProvider { get; private set; } public void ConfigureAuth(IAppBuilder app) { // add this assignment DataProtectionProvider = app.GetDataProtectionProvider(); // Configure the db context, user manager and signin manager to use a single instance per request app.CreatePerOwinContext(SampleDataContext.Create); app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>()); app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationSignInManager>()); } }

仅从此处获得了解决方案 这是非常有帮助的文章

just got solution from here it is very helpful article

更多推荐

使用依赖项注入时未注册IUserTokenProvider

本文发布于:2023-11-16 02:07:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1600027.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:未注册   IUserTokenProvider

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!