tutorial net mvc framework espaƱol asp and asp.net asp.net-mvc asp.net-identity

asp.net - net - identity framework c#



Cambie el tipo de Id. De usuario a int en la identidad de ASP.NET en VS2015 (2)

  1. IdentityModels.cs cambia a esto:

    // New derived classes public class UserRole : IdentityUserRole<int> { } public class UserClaim : IdentityUserClaim<int> { } public class UserLogin : IdentityUserLogin<int> { } public class Role : IdentityRole<int, UserRole> { public Role() { } public Role(string name) { Name = name; } } public class UserStore : UserStore<ApplicationUser, Role, int, UserLogin, UserRole, UserClaim> { public UserStore(ApplicationDbContext context): base(context) { } } public class RoleStore : RoleStore<Role, int, UserRole> { public RoleStore(ApplicationDbContext context): base(context) { } } // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser<int, UserLogin, UserRole, UserClaim> { public DateTime? ActiveUntil; public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here return userIdentity; } } public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, int, UserLogin, UserRole, UserClaim> { public ApplicationDbContext() : base("DefaultConnection") { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } }

  2. En `App_Start / IdentityConfig.cs, cambie las siguientes clases:

    public class ApplicationUserManager : UserManager<ApplicationUser, int> { public ApplicationUserManager(IUserStore<ApplicationUser, int> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get<ApplicationDbContext>())); // Configure validation logic for usernames manager.UserValidator = new UserValidator<ApplicationUser, int>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 8, // 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 it in here. manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser, int> { MessageFormat = "Your security code is {0}" }); manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser, int> { Subject = "Security Code", 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, int>(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } } // Configure the application sign-in manager which is used in this application. public class ApplicationSignInManager : SignInManager<ApplicationUser, int> { 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); } }

  3. En App_Start/Startup.Auth.cs cambie la propiedad OnValidateIdentity a esto:

    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager), getUserIdCallback: id => id.GetUserId<int>())

  4. Cambie ManageController para trabajar con el nuevo tipo de pk:

Reemplace todas las entradas de User.Identity.GetUserId() a User.Identity.GetUserId<int>()

Puede haber un par de argumentos de id de cadena que deben cambiarse a int , pero eso es todo.

Por defecto, la identidad de ASP.NET en VS 2015 usa una cadena como clave principal para las tablas de AspNet ***. Quería usar identificadores int-typed en su lugar. Después de algunas investigaciones, se descubrió que las diferentes identificaciones mecanografiadas son compatibles con el marco listo para usar. En la respuesta a continuación mostraré qué cambios hacer para lograrlo.

ACTUALIZACIÓN: Después de agregar mi respuesta, encontré esta publicación de blog en el sitio asp.net que describe lo mismo pero más completo: http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity


Por esta entrada de blog , con ASP.NET Core Identity, realice los siguientes cambios:

Primero, vaya a la carpeta Data/Migrations y elimine todo lo que contenga.

En Startup.cs , en el método ConfigureServices , cambie services.AddIdentity para

services.AddIdentity<ApplicationUser, IdentityRole<int>>() .AddEntityFrameworkStores<ApplicationDbContext, int>() .AddDefaultTokenProviders();

En ApplicationDbContext.cs cambie la clase base de IdentityDbContext<ApplicationUser> a

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<int>, int>

Finalmente, cambie la clase base en ApplicationUser.cs de IdentityUser a

public class ApplicationUser : IdentityUser<int>

Luego ejecute add-migration -o Data/Migrations y update-database . Si las migraciones causan problemas, use Sql Server Management Studio o SqlServerObjectExplorer en VS para eliminar la base de datos ( no solo use el sistema de archivos), vuelva a eliminar sus migraciones e intente nuevamente.