Disabilitare l’utente in ASPNET id quadro 2.0

Sto cercando un modo per disabilitare l’utente invece di eliminarlo dal sistema, questo è per mantenere l’integrità dei dati dei relativi dati. Ma sembra che l’id quadro di ASPNET offra solo un account di cancellazione.

C’è una nuova funzione di blocco, ma sembra che il blocco possa essere controllato per disabilitare l’utente, ma bloccare l’utente solo dopo un certo numero di tentativi di password errati.

Altre opzioni?

Quando crei un sito con i bit di id quadro installati, il tuo sito avrà un file chiamato “IdentityModels.cs”. In questo file è una class denominata ApplicationUser che eredita da IdentityUser.

// 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 

C’è un link carino nei commenti lì, per facilità clicca qui

Questo tutorial ti dice esattamente cosa devi fare per aggiungere proprietà personalizzate per il tuo utente.

E in realtà, non preoccuparti nemmeno di guardare il tutorial.

1) aggiungi una proprietà alla class ApplicationUser, ad esempio:

 public bool? IsEnabled { get; set; } 

2) aggiungi una colonna con lo stesso nome nella tabella AspNetUsers nel tuo DB.

3) boom, il gioco è fatto!

Ora nel tuo AccountController, hai un’azione Registra come segue:

 public async Task Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email, IsEnabled = true }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) 

Ho aggiunto IsEnabled = true alla creazione dell’object ApplicationUser. Il valore verrà ora mantenuto nella nuova colonna nella tabella AspNetUsers.

Dovresti quindi occuparti di verificare questo valore come parte del processo di accesso, ignorando PasswordSignInAsync in ApplicationSignInManager.

L’ho fatto come segue:

 public override Task PasswordSignInAsync(string userName, string password, bool rememberMe, bool shouldLockout) { var user = UserManager.FindByEmailAsync(userName).Result; if ((user.IsEnabled.HasValue && !user.IsEnabled.Value) || !user.IsEnabled.HasValue) { return Task.FromResult(SignInStatus.LockedOut); } return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout); } 

Il tuo chilometraggio può variare e potresti non voler restituire quel SignInStatus, ma ti viene l’idea.

Non è necessario creare una proprietà personalizzata. Il trucco è impostare la proprietà LockoutEnabled sull’utente Identity E impostare LockoutoutEndDateUtc su una data futura dal codice per bloccare un utente. Quindi, chiamare UserManager.IsLockedOutAsync(user.Id ) restituirà false.

Sia LockoutEnabled che LockoutoutEndDateUtc devono soddisfare i criteri di data vera e futura per bloccare un utente. Se, ad esempio, il valore LockoutoutEndDateUt c è 2014-01-01 00:00:00.000 e LockoutEnabled è true , la chiamata a UserManager.IsLockedOutAsync(user.Id) restituirà true . Posso capire perché Microsoft l’ha progettato in questo modo in modo da poter impostare un lasso di tempo su quanto tempo un utente è bloccato.

Tuttavia, direi che dovrebbe essere se LockoutEnabled è true quindi l’utente dovrebbe essere bloccato se LockoutoutEndDateUtc è NULL O una data futura. In questo modo non devi preoccuparti del codice relativo all’impostazione di due proprietà ( LockoutoutEndDateUtc è NULL per impostazione predefinita). È ansible impostare LockoutEnabled su true e se LockoutoutEndDateUtc è NULL l’utente viene bloccato a tempo indeterminato.

La proprietà LockoutEnabled predefinita per un User non è la proprietà che indica se un utente è attualmente bloccato o meno. È una proprietà che indica se l’utente deve essere sobject a blocco o meno quando AccessFailedCount raggiunge il valore MaxFailedAccessAttemptsBeforeLockout . Anche se l’utente è bloccato, è solo una misura temporanea per bloccare l’utente per la durata della proprietà LockedoutEnddateUtc . Pertanto, per disabilitare o sospendere definitivamente un account utente, è ansible che si desideri introdurre la propria proprietà flag.

È necessario introdurre il proprio contrassegno in una class derivata da IdentityUser personalizzata e implementare / imporre la propria logica sull’triggerszione / distriggerszione e impedire all’utente di accedere se disabilitato.

È ansible utilizzare queste classi … Un’implementazione pulita dell’id quadro ASP.NET … È il mio codice. int è qui per la chiave primaria se vuoi un tipo diverso per la chiave primaria puoi cambiarla.

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 ApplicationUserStore(context.Get())); manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, }; manager.UserLockoutEnabledByDefault = false; var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider( dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } } 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); } } public class ApplicationRoleManager : RoleManager { public ApplicationRoleManager(IRoleStore store) : base(store) { } } public class ApplicationRoleStore : RoleStore { public ApplicationRoleStore(ApplicationContext db) : base(db) { } } public class ApplicationUserStore : UserStore { public ApplicationUserStore(ApplicationContext db) : base(db) { } } 

IdentityModel.cs

 public class ApplicationUser : IdentityUser { //your property //flag for users state (active, deactive or enabled, disabled) //set it false to disable users public bool IsActive { get; set; } public ApplicationUser() { } public async Task GenerateUserIdentityAsync(UserManager manager) { var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; } } public class ApplicationUserRole : IdentityUserRole { } public class ApplicationLogin : IdentityUserLogin { public virtual ApplicationUser User { get; set; } } public class ApplicationClaim : IdentityUserClaim { public virtual ApplicationUser User { get; set; } } public class ApplicationRole : IdentityRole { public ApplicationRole() { } } public class ApplicationContext : IdentityDbContext { //web config connectionStringName DefaultConnection change it if required public ApplicationContext() : base("DefaultConnection") { Database.SetInitializer(new CreateDatabaseIfNotExists()); } public static ApplicationContext Create() { return new ApplicationContext(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove(); modelBuilder.Conventions.Remove(); modelBuilder.Conventions.Remove(); } } 

Per codice di esempio

È necessario implementare il proprio UserStore per rimuovere l’identity framework.

Anche questo potrebbe aiutarti.

Tutto ciò che ho fatto in realtà:

  var lockoutEndDate = new DateTime(2999,01,01); UserManager.SetLockoutEnabled(userId,true); UserManager.SetLockoutEndDate(userId, lockoutEndDate); 

Che è fondamentalmente abilitare il blocco (se non lo fai già per impostazione predefinita, e quindi impostare la data di fine del blocco su un valore distante.