8

के साथ एएसपी.NET पहचान अनुप्रयोग यूज़र प्रबंधक को कॉन्फ़िगर कैसे करें मैं अपनी परियोजना में एएसपीनेट पहचान का उपयोग कर रहा हूं और संरचना ढांचे का उपयोग डी फ्रेमवर्क के रूप में कर रहा हूं। समस्या यह है जब मैं निर्माता इंजेक्शन का उपयोग तो ApplicationUserManager यह सदस्यों के सभी कॉन्फ़िगर नहीं किया गया जैसे TokenProvider, ...स्ट्रक्चर मैप

यह मेरा ApplicationUserManager वर्ग है:

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"), 
     }); 
    } 
} 
:

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 वर्ग है

और उसके मेरी 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; 
    } 
} 

मेरी qu estion यह है कि मैं अपने अनुप्रयोग यूज़र प्रबंधक को structmap के साथ कैसे कॉन्फ़िगर कर सकता हूं? अगर मैं नीचे दिए गए कोड यह काम करता है के रूप में सेट, लेकिन मैं यह एक अच्छा समाधान है या नहीं पता नहीं है:

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

कृपया मुझे संकेत अगर वहाँ एक बेहतर समाधान है और अगर यह ठीक है तो क्या है इसके लिए सबसे अच्छा जीवनकाल? HttpContextScope, सिंगलटन, ...?

+2

मैंने अभी पहचान और डी-कंटेनर के बारे में ब्लॉग किया है: http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/ इससे शायद आपकी मदद मिलेगी। – trailmax

उत्तर

5

इससे पहले कि आप इसके लिए स्ट्रक्चर मैप कॉन्फ़िगरेशन बनाएं, यह जानने में मदद करता है कि आप इसे मैन्युअल रूप से कैसे बनाएंगे, यानी, यदि आप वास्तव में सब कुछ "नया" बनाते हैं।

उपयोगकर्ता प्रबंधक के पास 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 
}; 

उपयोगकर्ता प्रबंधक को कॉन्फ़िगर करने के बारे में सबसे जटिल हिस्सा UserTokenProvider (जो डेटा सुरक्षा एपीआई का उपयोग करता है) से संबंधित है, यदि आप इसे मैन्युअल रूप से करेंगे तो यह 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 भी है, जहां इस कॉन्फ़िगरेशन का उपयोग करके, आप उपयोगकर्ताओं को बना, सूचीबद्ध और हटा सकते हैं।

संबंधित मुद्दे