我正在使用Unity for Dependencies Injection并使用Identiy Provider来管理用户登录,注册,电子邮件确认等.
当我尝试注册用户时,我遇到了这个问题:
当前类型Microsoft.Owin.Security.IAuthenticationManager是一个接口,无法构造.你错过了类型映射吗?
我不知道如何在我的Unity容器中注册此接口(IAuthenticationManager).
我尝试使用此代码注册接口,但如果我把它,我还有其他问题:
没有注册IUserTokenProvider.
container.RegisterType( new InjectionFactory(_ => new HttpContextWrapper(HttpContext.Current))); container.RegisterType (new InjectionFactory(c => c.Resolve ().GetOwinContext())); container.RegisterType ( new InjectionFactory(c => c.Resolve ().Authentication));
我把一些应用程序的代码(如果我不使用Unity,一切正常):
的AccountController
private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }
IdentityConfig.cs
public class ApplicationUserManager : UserManager{ public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore (context.Get ())); // Configure validation logic for usernames manager.UserValidator = new UserValidator (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 { MessageFormat = "Your security code is: {0}" }); manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider { 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 (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 { public ApplicationRoleManager(IRoleStore roleStore) : base(roleStore) { } public static ApplicationRoleManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationRoleManager(new RoleStore (context.Get ())); } } 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 // This example shows you how to create a new database if the Model changes public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges { 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 (); var roleManager = HttpContext.Current.GetOwinContext().Get (); 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 { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager (), context.Authentication); } }
谢谢!!