8

Sto utilizzando l'identità asp.net nel mio progetto e utilizzo structuremap come framework DI. il problema è quando uso l'iniezione costruttore poi ApplicationUserManager non configurato tutti i suoi membri, ad esempio TokenProvider, ...Come configurare ASP.NET Identity ApplicationUserManager con StructureMap

questa è la mia classe ApplicationUserManager:

public class ApplicationUserManager : UserManager<User, long> 
{ 
    public ApplicationUserManager(IUserStore<User, long> store) 
     : base(store) 
    { 
    } 

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(new CustomUserStore(context.Get<InsuranceManagementContext>())); 

     // Configure the application user manager 
     manager.UserValidator = new UserValidator<User, long>(manager) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = false 
     }; 

     manager.PasswordValidator = new PasswordValidator 
     { 
      RequireDigit = true, 
      RequiredLength = 8, 
      RequireLowercase = false, 
      RequireNonLetterOrDigit = true, 
      RequireUppercase = false 
     }; 

     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      manager.UserTokenProvider = 
       new DataProtectorTokenProvider<User, long>(dataProtectionProvider.Create("TEST")); 
     } 

     return manager; 
    } 
} 

questo è di classe Startup.Auth:

public partial class Startup 
{ 
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.CreatePerOwinContext(InsuranceManagementContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

     // Enable the application to use a cookie to store information for the signed in user 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      ExpireTimeSpan = TimeSpan.FromHours(2.0), 
      AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
     }); 
    } 
} 

e la mia AccountController:

public class AccountController : BaseController 
{ 
    private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

    public AccountController(ApplicationUserManager userManager) 
    { 
     UserManager = userManager; 
    } 
} 

mia qu è come posso configurare ApplicationUserManager con structuremap? se ho impostato come il codice qui sotto funziona, ma non so che è una buona soluzione o no:

ObjectFactory.Initialize(x => 
{ 
    ... 
    x.For<ApplicationUserManager>().Use(() => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()); 
    ... 
}); 

favore, accennano me se c'è una soluzione migliore e se è ok, allora qual è il miglior vita per questo? HttpContextScope, Singleton, ...?

+2

Ho appena eseguito il blogging su Identity e DI-containers: http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/ questo probabilmente ti aiuterà. – trailmax

risposta

5

Prima di creare la configurazione di StructureMap per questo, è utile sapere come lo si creerà manualmente, ovvero se si "riordina" tutto da solo.

UserManager ha una dipendenza su IUserStore e l'implementazione EntityFramework (UserStore) ha una dipendenza da DbContext. Fare tutto manualmente sarebbe simile a questa:

var dbContext = new IdentityDbContext("Your ConnectionString Name"); 
var userStore = new UserStore<IdentityUser>(dbContext); 
var userManager = new UserManager<IdentityUser>(userStore); 

(Sostituire IdentityUser con il proprio utente personalizzata, se si utilizza uno)

È quindi possibile configurare UserManager come questo:

userManager.PasswordValidator = new PasswordValidator 
{ 
    RequiredLength = 6 
}; 

Il La parte più complicata della configurazione di userManager è legata a UserTokenProvider (che utilizza l'API di protezione dei dati), se lo si farebbe manualmente sarebbe look like this:

var dataProtectionProvider = new DpapiDataProtectionProvider("Application name"); 
var dataProtector = dataProtectionProvider.Create("Purpose"); 
userManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(dataProtector); 

Ecco un esempio di un Registro di sistema StructureMap (si può estrapolare da questo esempio e adattarlo alle proprie esigenze):

public DefaultRegistry() { 
     Scan(
      scan => { 
       scan.TheCallingAssembly(); 
       scan.WithDefaultConventions(); 
       scan.With(new ControllerConvention()); 
      }); 


     For<IUserStore<IdentityUser>>() 
      .Use<UserStore<IdentityUser>>() 
      .Ctor<DbContext>() 
      .Is<IdentityDbContext>(cfg => cfg.SelectConstructor(() => new IdentityDbContext("connection string")).Ctor<string>().Is("IdentitySetupWithStructureMap")); 

     ForConcreteType<UserManager<IdentityUser>>() 
      .Configure 
      .SetProperty(userManager => userManager.PasswordValidator = new PasswordValidator 
      { 
       RequiredLength = 6 
      }) 
      .SetProperty(userManager => userManager.UserValidator = new UserValidator<IdentityUser>(userManager));     
    } 

ho scritto un blog post about this, si spiega il processo che ha portato a questa configurazione, c'è anche un link to an example on github of an MVC project dove, usando questa configurazione, è possibile creare, elencare ed eliminare utenti.

Problemi correlati