2015-05-27 3 views
5

Ich habe einen Fehler erhalten, wenn meine GeneratePasswordResetTokenAsync()-Methode aufgerufen wird. Ich habe Autofac mit Identität konfiguriert.Kein IUserTokenProvider ist registriert, wenn die Abhängigkeitsinjektion verwendet wird

Der Fehler ist:

Kein IUserTokenProvider registriert wird, wenn Dependency Injection mit

In meinem sample.web Projekt gibt es eine AutofacConfig.cs Datei, in der ich mich registrieren signinmanager und usermanager, die ich in sample.repository Projekt erstellt.

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; 
    } 
} 
+0

Sie haben keinen 'IUserTokenProvider' registriert. Sehen Sie http://StackOverflow.com/Questions/22629936/No-Iusertokenprovider-is-registered, um zu sehen, wie man ein –

Antwort

9

Remove create() Methode in ApplicationUserManager.cs Klasse und diesen Code in Konstruktor ApplicationUserManager Klasse hinzuzufügen.

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


    } 

Register DataProtectionProvider in AutofacConfig.cs

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

Resolve ApplicationUSerManager Klasse in Startup.cs Klasse

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

     } 
    } 

nur bekam Lösung von hereDatei 0 es ist sehr hilfreich Artikel

+1

anmeldet Bitte vermeiden Sie, mit nur dem Link zu antworten. Weitere Informationen finden Sie unter http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers. –

+0

Das Hinzufügen von Abhängigkeiten, die über die Füllung hinausgehen, in einem Konstruktor ist nicht gut trainieren. Wenn die Logik dort fehlschlägt, wird sie oft im Zusammenhang mit irgendeiner Art von Abhängigkeitsinjektion verborgen. –

+0

Sie haben meinen Tag gerettet, danke! – kloarubeek

Verwandte Themen