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

调用GeneratePasswordResetTokenAsync()方法时出错。 我用owin身份配置了autofac。

错误是:

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

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

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()); } } 

从这里得到解决方案这是非常有用的文章