2015-06-20 13 views
7

Próbuję zaimplementować własny DAL dla asp.net Identity 2.0 z funkcjonalnością, której potrzebuję. Nie potrzebuję funkcji blokady konta. Ale gdy próbuję zadzwonićSklep nie implementuje IUserLockoutStore <TUser>

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

uzyskać System.NotSupportedException:Store does not implement IUserLockoutStore<TUser>.

Więc dlaczego muszę wdrożyć IUserLockoutStore gdybym nie potrzebują?

Odpowiedz

10

Zobacz tę odpowiedź: When implementing your own IUserStore, are the "optional" interfaces on the class actually optional?

Trzeba będzie oszukać lub nadpisać metodę próbujesz zadzwonić do sklepu aby wdrożyć taki, który nie korzysta z „opcjonalne” sklep blokady.

Może być nieprzyjemnie zaskoczony fakt, że konieczne jest również wdrożenie opcjonalnego interfejsu dla dwóch czynników. Użyj tej samej odpowiedzi poniżej, aby to zrobić, chyba że masz środek dwuczynnikowy.

Najpierw jednak tutaj jest wdrożenie domyślny:

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; 
     } 

Jedna odpowiedź: tworzyć niepotrzebnych zapasów.

#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 
} 

Inne rozwiązanie: zastąp, aby po prostu go nie używać.

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 na końcu nie działa już. Czy możesz aktualizować? – Vinigas

Powiązane problemy