2017-02-15 2 views
0

Ich versuche derzeit, meine eigene PasswordSignInAsync-Methode auf dem ApplicationSignInManager zu implementieren, aber bisher kann es nicht authentifizieren, obwohl die Methode keine Fehler wirft, hier ist mein Code in IdentityConfig .cs. Ich habe bereits ASP-Identität konfiguriert, um lange als Primärschlüssel zu verwenden.ASP Identität benutzerdefiniertes Passwort Signin funktioniert nicht

Ich weiß nicht, ob ich vermisse eine zusätzliche Operation zum Erstellen einer richtigen Benutzeranmeldung, könnte mir jemand zeigen, was ich vermisse, ich habe keinen Code dafür gefunden. Diese benutzerdefinierte Funktion übergibt einen zusätzlichen Parameter an die GenerateUserIdentityAsync-Methode des ApplicationUser.

public class ApplicationSignInManager : SignInManager<ApplicationUser, long> 
    { 
     public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) 
      : base(userManager, authenticationManager) 
     { 
     } 

     public async Task<SignInStatus> PasswordSystemSignInAsync(string userName, string password, bool IsPersistent, bool shouldLockout, bool IsAdministrative, string securityCode = null) 
     { 
      var user = await UserManager.FindByNameAsync(userName); 
      if(user != null) 
      { 
       bool passwordCheck = await UserManager.CheckPasswordAsync(user, password); 
       if (passwordCheck) 
       { 
        var signInUser = await user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager, IsAdministrative); 
        if (signInUser.IsAuthenticated) 
        { 
         return SignInStatus.Success; 
        } 
        return SignInStatus.Failure; 
       } 
       return SignInStatus.Failure; 
      } 
      return SignInStatus.Failure; 
     } 
} 

Antwort

1

In der Methode erstellen Sie die Identität, aber Sie sind nicht in der generierten Identität anmelden. Stellen Sie sich Folgendes vor:

public async Task<SignInStatus> PasswordSystemSignInAsync(string userName,string password, bool IsPersistent, bool shouldLockout, bool IsAdministrative, string securityCode = null) 
{ 
    var user = await UserManager.FindByNameAsync(userName); 
    if(user != null) 
    { 
     bool passwordCheck = await UserManager.CheckPasswordAsync(user, password); 
     if (passwordCheck) 
     { 
      var userIdentity = await user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager, IsAdministrative); 
      AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie); 
      AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = IsPersistent}, userIdentity); 
      return SignInStatus.Success; 
     } 
     return SignInStatus.Failure; 
    } 
    return SignInStatus.Failure; 
} 
+0

Was genau macht das AuthenticationManager.signout? Und auf dem SignIn muss ich alle Eigenschaften einstellen? Ruft die Methode alle anderen Eigenschaften von Startup.Auth ab? –

+0

@Forcefield Um sicherzustellen, dass der Benutzer nicht bereits angemeldet ist, können Sie einfach die Methode 'signOut' aufrufen, um den Benutzer abzumelden. Die Methode ist sicher und macht nichts, wenn sich der Benutzer nicht bereits angemeldet hat. Nein, Sie müssen nicht alle Eigenschaften, die gerade gefüllt werden, einmal einstellen, wenn Sie Änderungen vornehmen möchten. –

+0

Das ist der Weg! Nur die IsPersistent aus dem Parameter übergeben ist die einzige Änderung, die ich zu Ihrer Antwort machen würde. Hat der Identity SignIn-Manager dies irgendwo referenziert? Ich konnte keine Beispiele passender PasswordSignInMethod finden, die nicht die Basis aufgerufen haben –

Verwandte Themen