8

Я использую идентификатор asp.net в своем проекте и использую структуру структуры как структуру DI. проблема, когда я использую инъекции конструктора затем ApplicationUserManager не сконфигурировано все ее членов, например, TokenProvider, ...Как настроить ASP.NET Identity ApplicationUserManager с StructureMap

это мой 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; 
    } 
} 

это 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"), 
     }); 
    } 
} 

и его мой 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; 
    } 
} 

мой Цюй estion - как я могу настроить свой ApplicationUserManager с помощью структуры? если я установить его в коде ниже это работает, но я не знаю, что это хорошее решение или нет:

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

пожалуйста намекает мне, если есть лучшее решение, и если это нормально, то, что является лучший жизненный цикл для этого? HttpContextScope, Singleton, ...?

+2

Я только что писал о Identity и DI-контейнерах: http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/, это, вероятно, поможет вам. – trailmax

ответ

5

Прежде чем создавать конфигурацию StructureMap для этого, это помогает узнать, как вы его создадите вручную, то есть, если вы действительно «обновляете» все сами.

UserManager имеет зависимость от IUserStore, а его реализация EntityFramework (UserStore) имеет зависимость от DbContext. Делая все вручную будет выглядеть следующим образом:

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

(Заменить IdentityUser с настраиваемого пользователем, если вы используете один)

Вы можете настроить UserManager так:

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

самая сложная часть о настройке userManager связана с UserTokenProvider (который использует защиту данных api), если вы сделаете это вручную, это будет look like this:

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

Вот пример реестра StructureMap (вы можете экстраполировать из этого примера и адаптировать его к своим потребностям):

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

Я написал блог post about this, это объясняет процесс, который привел к этому конфигурации, также есть link to an example on github of an MVC project, где, используя эту конфигурацию, вы можете создавать, списывать и удалять пользователей.

Смежные вопросы