Registre IAuthenticationManager avec l'Unité
Je suis à l'aide de l'Unité pour l'Injection des Dépendances et de l'aide d'Identité Fournisseur pour gérer la connexion de l'utilisateur, enregistrer, email de confirmation, etc.
Quand j'essaie d'enregistrer un utilisateur, j'ai ce problème:
Le type de courant, Microsoft.Owin.De sécurité.IAuthenticationManager, est
une interface ne peut pas être construit. Êtes-vous manque un type
la cartographie?
Je n'ai aucune idée de comment enregistrer cette Interface (IAuthenticationManager) dans mon Unité de conteneur.
J'ai essayé de l'inscription de l'interface avec ce code, mais si je l'ai mis, j'ai d'autres problème:
Pas IUserTokenProvider est enregistré.
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));
J'ai mis un peu de code de l'application (Si je n'utilisez pas l'Unité, tous les beaux travaux):
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 [email protected] 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 = "[email protected]";
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);
}
}
Merci!!
- J'ai suivi ce tuto... asp.net/identity/overview/features-api/...
- Je l'ai fait aussi @chemitaxis et il s'est avéré que l'utilisation d'un anti-modèle avec ce non-sens de 'CreatePerOwinContext" qui vous déconnecte de la les intentions de votre conteneur d'injection de dépendances. Je vais maintenant essayer d'échapper aux griffes. app.CreatePerOwinContext(ApplicationDbContext.Créer); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Créer); app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Créer); app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Créer);
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'ai fait pour rendre l'Unité jouer gentil avec ASP.NET Identité 2.0:
J'ai ajouté les lignes suivantes à la
RegisterTypes
méthode dans leUnityConfig
classe:container.RegisterType<ManageController>(new InjectionConstructor());
comme @Jenan a déclaré. J'ai eu les 4 autres lignes dans cette réponse, mais aussi besoin de cette ligne supplémentaire.Essayez d'ajouter en dessous de la ligne dans la classe
UnityConfig
:Si vous voulez vraiment utiliser l'Unité pour gérer tous vos dépendances, vous pouvez essayer de vous inscrire également à la IAuthenticationManager dans l'Unité
Avec quelques petites adaptations, vous pouvez alors utiliser l'Unité pour résoudre toutes les dépendances nécessaires pour Asp.net l'Identité.
J'ai trouvé un super post sur ce (également testé par moi) ici:
http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/
Cela fonctionnera également comme une configuration complète pour permettre l'utilisation de l'Unité de l'Identité 2.0:
Avec ce paramètre, vous n'aurez pas besoin de vous inscrire le AccountController ou ManageController types d'Unité.
Réputation ne me laisse pas de commentaire, mais pour ajouter à user3849637s marqué réponse, pour MVC avec mise à Jour 3, vous devrez également ajouter le ManageController que certaines fonctions de l'utiliser avec la mise à jour de l'échafaudage: