使用依赖项注入时,未注册IUserTokenProvider
调用GeneratePasswordResetTokenAsync()
方法时出错。 我用owin身份配置了autofac。
错误是:
使用依赖项注入时,未注册IUserTokenProvider
在我的sample.web
项目中有一个AutofacConfig.cs
文件,我在其中注册了我在usermanager
项目中创建的signinmanager
和usermanager
。
AutofacConfig.cs
public class AutofacConfig { public static Autofac.IContainer RegisterDependencies() { var containerBuilder = new ContainerBuilder(); // REGISTER DEPENDENCIES containerBuilder.RegisterType() .As() .InstancePerDependency(); containerBuilder.RegisterType<UserStore>() .As<IUserStore>() .InstancePerRequest(); containerBuilder.RegisterType() .AsSelf() .InstancePerRequest(); containerBuilder.RegisterType() .AsSelf() .InstancePerRequest(); containerBuilder.RegisterType(); containerBuilder.Register(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 { public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); // Configure validation logic for usernames manager.UserValidator = new UserValidator(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 { MessageFormat = "Your security code is {0}" }); manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider { 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( provider.Create("ASP.NET Identity")); return manager; } }
删除ApplicationUserManager.cs类中的create()方法,并在ApplicationUserManager类的构造函数中添加该代码。
ApplicationUserManager.cs
public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store, IDataProtectionProvider dataProtectionProvider) : base(store) { // Configure validation logic for usernames this.UserValidator = new UserValidator (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 { MessageFormat = "Your security code is {0}" }); this.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider { 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 (dataProtector); } } }
在AutofacConfig.cs文件中注册DataProtectionProvider
containerBuilder.Register(c => Startup.DataProtectionProvider).InstancePerRequest();
在Startup.cs类中解析ApplicationUSerManager类
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()); app.CreatePerOwinContext(() => DependencyResolver.Current.GetService()); } }
从这里得到解决方案这是非常有用的文章
上述就是C#学习教程:使用依赖项注入时,未注册IUserTokenProvider分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959341.html