2015-06-20 6 views
7

Ich versuche, eigene DAL für asp.net Identity 2.0 mit Funktionalität zu implementieren, die ich brauche. Ich benötige keine Kontosperrungsfunktion. Aber wenn ich versucheStore implementiert nicht IUserLockoutStore <TUser>

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

ich anrufen System.NotSupportedException:Store does not implement IUserLockoutStore<TUser>.

Warum sollte ich also IUserLockoutStore implementieren müssen, wenn ich es nicht brauchen?

Antwort

10

Siehe diese Antwort: When implementing your own IUserStore, are the "optional" interfaces on the class actually optional?

Sie müssen die Methode, die Sie versuchen, in Ihrem Geschäft betrügen oder außer Kraft setzen rufen Sie eine zu implementieren, die nicht die „optional“ Lockout Speicher nicht verwendet.

Sie können unangenehm überrascht sein, dass Sie auch die "optionale" Schnittstelle für Zwei-Faktor implementieren müssen. Verwenden Sie die gleiche Antwort unten, es sei denn, Sie verfügen über zwei Faktoren.

Zunächst aber hier ist die Standardimplementierung:

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) 
     { 
      ... 
      if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture()) 
      { 
       return SignInStatus.LockedOut; 
      } 
      if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture()) 
      { 
       return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture(); 
      } 
      ... 
      return SignInStatus.Failure; 
     } 

Eine Antwort: nutzlos Shops erstellen.

#region LockoutStore 
    public Task<int> GetAccessFailedCountAsync(MyUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task<bool> GetLockoutEnabledAsync(MyUser user) 
    { 
     return Task.Factory.StartNew<bool>(() => false); 
    } 

    public Task<DateTimeOffset> GetLockoutEndDateAsync(MyUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task<int> IncrementAccessFailedCountAsync(MyUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task ResetAccessFailedCountAsync(MyUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task SetLockoutEnabledAsync(MyUser user, bool enabled) 
    { 
     throw new NotImplementedException(); 
    } 

    public Task SetLockoutEndDateAsync(MyUser user, DateTimeOffset lockoutEnd) 
    { 
     throw new NotImplementedException(); 
    } 
    #endregion 
} 

Eine andere Lösung: überschreiben, um es einfach nicht zu verwenden.

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) 
     { 
      ... 
      if (false) 
      { 
       return SignInStatus.LockedOut; 
      } 
      if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture()) 
      { 
       return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture(); 
      } 
      ... 
      return SignInStatus.Failure; 
     } 

cf/http://eliot-jones.com/Code/asp-identity/MyUserStore.cs

+0

Link am Ende funktioniert nicht mehr. Können Sie aktualisieren? – Vinigas

Verwandte Themen