调用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
发布评论