用Unity注册IAuthenticationManager

我使用Unity进行dependency injection,并使用Identiy Provider来pipe理用户login,注册,电子邮件确认等。

当我尝试注册一个用户,我有这个问题:

当前typesMicrosoft.Owin.Security.IAuthenticationManager是一个接口,无法构build。 你是否缺less一个types映射?

我不知道如何在我的Unity容器中注册这个接口(IAuthenticationManager)。

我试着用这个代码注册接口,但如果我把它,我有其他问题:

没有IUserTokenProvider注册。

container.RegisterType<HttpContextBase>( new InjectionFactory(_ => new HttpContextWrapper(HttpContext.Current))); container.RegisterType<IOwinContext>(new InjectionFactory(c => c.Resolve<HttpContextBase>().GetOwinContext())); container.RegisterType<IAuthenticationManager>( new InjectionFactory(c => c.Resolve<IOwinContext>().Authentication)); 

我把应用程序的一些代码(如果我不使用统一,一切工作正常):

的AccountController

 private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } 

IdentityConfig.cs

 public class ApplicationUserManager : UserManager<ApplicationUser> { public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); // Configure validation logic for usernames manager.UserValidator = new UserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, }; // 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 in here. manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser> { MessageFormat = "Your security code is: {0}" }); manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser> { Subject = "SecurityCode", BodyFormat = "Your security code is {0}" }); manager.EmailService = new EmailService(); manager.SmsService = new SmsService(); var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } } // Configure the RoleManager used in the application. RoleManager is defined in the ASP.NET Identity core assembly public class ApplicationRoleManager : RoleManager<IdentityRole> { public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore) : base(roleStore) { } public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) { return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>())); } } public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // Plug in your email service here to send an email. return Task.FromResult(0); } } public class SmsService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // Plug in your sms service here to send a text message. return Task.FromResult(0); } } // This is useful if you do not want to tear down the database each time you run the application. // public class ApplicationDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext> // This example shows you how to create a new database if the Model changes public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> { protected override void Seed(ApplicationDbContext context) { InitializeIdentityForEF(context); base.Seed(context); } //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role public static void InitializeIdentityForEF(ApplicationDbContext db) { var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>(); const string name = "admin@example.com"; const string password = "Admin@123456"; const string roleName = "Admin"; //Create Role Admin if it does not exist var role = roleManager.FindByName(roleName); if (role == null) { role = new IdentityRole(roleName); var roleresult = roleManager.Create(role); } var user = userManager.FindByName(name); if (user == null) { user = new ApplicationUser { UserName = name, Email = name }; var result = userManager.Create(user, password); result = userManager.SetLockoutEnabled(user.Id, false); } // Add user admin to Role Admin if not already added var rolesForUser = userManager.GetRoles(user.Id); if (!rolesForUser.Contains(role.Name)) { var result = userManager.AddToRole(user.Id, role.Name); } } } public class ApplicationSignInManager : SignInManager<ApplicationUser, string> { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication); } } 

谢谢!!

下面是我为了让Unity在ASP.NET Identity 2.0中发挥出色所做的一切:

我将以下内容添加到UnityConfig类的RegisterTypes方法中:

 container.RegisterType<DbContext, ApplicationDbContext>( new HierarchicalLifetimeManager()); container.RegisterType<UserManager<ApplicationUser>>( new HierarchicalLifetimeManager()); container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>( new HierarchicalLifetimeManager()); container.RegisterType<AccountController>( new InjectionConstructor()); 

尝试在类UnityConfig添加下面的行:

 container.RegisterType<IAuthenticationManager>( new InjectionFactory( o => System.Web.HttpContext.Current.GetOwinContext().Authentication ) ); 

如果你真的想用Unity来pipe理所有的依赖,你可以尝试在Unity中注册IAuthenticationManager

  container.RegisterType<IAuthenticationManager>( new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication)); 

稍加修改之后,您就可以使用Unity来parsing所有需要的Asp.net标识依赖关系。

我在这里发现了一个很棒的post(也由我testing):

http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/

声誉不会让我评论,但要添加到user3849637s标记的答案,对于更新3的MVC,您还需要添加ManageController作为一些function使用更新的脚手架:

 container.RegisterType<ManageController>(new InjectionConstructor()); 

这也将作为一个完整的configuration,允许使用Unity与身份2.0:

 container.RegisterType<MyDbContext>(new PerRequestLifetimeManager(), new InjectionConstructor()); // Identity container.RegisterType<UserManager<User>>(new HierarchicalLifetimeManager()); container.RegisterType<SignInManager<User, string>>(new HierarchicalLifetimeManager()); container.RegisterType<IUserStore<User>, UserStore<User>>(new PerRequestLifetimeManager(), new InjectionFactory(x => new UserStore<User>(GetConfiguredContainer().Resolve<MyDbContext>()))); container.RegisterType<IAuthenticationManager>(new InjectionFactory(x => HttpContext.Current.GetOwinContext().Authentication)); 

使用此设置,您将不需要使用Unity注册AccountController或ManageControllertypes。