web-dev-qa-db-fra.com

IdentityManager personnalisé Asp.NET Identity

Dans ma candidature, je voudrais ajouter des conditions supplémentaires pour permettre aux utilisateurs de se connecter. Par exemple, l'administrateur est autorisé à "verrouiller" un compte d'utilisateur, pour une raison quelconque. Lorsque le compte est verrouillé, l'utilisateur ne peut pas se connecter. Notez que cela est différent pour le "verrouillage" en raison de plusieurs tentatives de connexion infructueuses. La condition de verrouillage peut être supprimée par l'administrateur.

Je vois que le modèle par défaut crée un ApplicationSignInManager qui dérive de la valeur par défaut.

public class ApplicationSignInManager : SignInManager<User, string>

L'action "Connexion" des appels du contrôleur "Compte"

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

Donc, ma tentative est de remplacer cette fonction

public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    User user = this.UserManager.FindByName(userName);
    if (null != user)
    {
        if (true == user.AccountLocked)
        {
            return (SignInStatus.LockedOut);
        }
    }

    var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

    return (result);
}

Il y a 2 problèmes avec cela. Tout d'abord, cela suppose que le "nom d'utilisateur" est unique pour chaque utilisateur. Bien que cela puisse être supposé en toute sécurité.

Deuxièmement, la fonction renvoie pratiquement un SignInStatus, qui est défini par l'identité Asp.net. Je ne peux pas modifier pour retourner quoi que ce soit d'autre, pour expliquer pourquoi la connexion peut échouer.

Quelqu'un pourrait-il apporter de bonnes solutions à cela?

13
phandinhlan

Pourquoi ne pas simplement créer une autre méthode au lieu de remplacer? Votre méthode retournera tout ce que vous devez savoir - un objet de retour qui saura si le compte est réellement connecté ou désactivé par l'administrateur (je pense que "désactivé" est un meilleur nom pour cela - évite la confusion). Et changez vos contrôleurs pour utiliser votre nouvelle méthode au lieu de la norme PasswordSignIn.

En ce qui concerne l'unicité du nom d'utilisateur - oui, les noms d'utilisateur sont uniques - c'est la seule façon dont les utilisateurs peuvent se connecter. Sinon, s'il y a 2 comptes avec le même nom d'utilisateur, comment le système saurait-il contre quel compte essayer le mot de passe?

14
trailmax