2016-05-04 14 views
2

私はc#mvc WebアプリケーションへのログインにMicrosoft.AspNet.Identityを使用しています。ロックアウトユーザーストアを含むさまざまなユーザーストアを実装しました。しかし、私はそれが適切に動作するようにすることはできません。カスタムユーザーマネージャでは、最大試行回数、ロックアウト時間などを設定します。Microsoft AspNet IDの実装IUserLockoutStore

manager.UserLockoutEnabledByDefault = true; 
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(30); 
manager.MaxFailedAccessAttemptsBeforeLockout = 5; 

上記のコードとパラメータを使用すると、ユーザーがロックされることはありません。 manager.MaxFailedAccessAttemptsBeforeLockoutを2に設定すると、1回の試行後にユーザーがロックされます。誰も "IUserLockoutStore"インターフェースを正しく実装する方法に関するチュートリアルを持っていますか?私は午前中にGoogleを検索しており、目標に近づいていません。ここに私の "IUserLockoutStore"インターフェースの実装があります。 UTC時間私が使用GetLockoutEndDateAsync

::(そしておそらくより大幅に)、あなたの戻り値からも

... new DateTimeOffset(DateTime.UtcNow.AddMinutes(-5)) 

public Task<DateTimeOffset> GetLockoutEndDateAsync(Gebruiker user) 
    { 
     var lockOutDate = user.LockOutDate.HasValue ? user.LockOutDate.Value : new DateTimeOffset(DateTime.Now.AddMinutes(-5)); 
     return Task.FromResult(lockOutDate); 
    } 
    public Task SetLockoutEndDateAsync(Gebruiker user, DateTimeOffset lockoutEnd) 
    { 
     user.LockOutDate = lockoutEnd; 
     user.IsLocked = true; 
     return Context.SaveChangesAsync(); 
    } 

    public Task<int> IncrementAccessFailedCountAsync(Gebruiker user) 
    { 
     user.LoginTry++; 
     return Context.SaveChangesAsync(); 
    } 

    public Task ResetAccessFailedCountAsync(Gebruiker user) 
    { 
     user.LoginTry = 0; 
     return Context.SaveChangesAsync(); 
    } 

    public Task<int> GetAccessFailedCountAsync(Gebruiker user) => Task.FromResult(user.LoginTry); 

    public Task<bool> GetLockoutEnabledAsync(Gebruiker user) => Task.FromResult(true); 

    public Task SetLockoutEnabledAsync(Gebruiker user, bool enabled)=> Task.FromResult(enabled); 

答えて

3

私の実装では、これら二つのものを除いて、あなたに非常に似ていますIncrementAccessFailedCountAsyncはカウントを返す必要があります(ただし、結果はSaveChangesです)。

public Task<int> IncrementAccessFailedCountAsync(Gebruiker user) 
{ 
    user.LoginTry++; 
    Context.SaveChangesAsync(); 
    return user.LoginTry; 
} 

SaveChangesAsyncもintを返すのは偶然のことであり、おそらくこれを気付かなかったのです。

最初にContext.SaveChangesAsync()に電話する必要はありません。これはIUserStoreの実装によって処理されます。 IUserLockoutStoreIUserLoginStoreIUserEmailStoreなど)はDBに保存されません。インフラストラクチャは、これらのインターフェイスを呼び出して設定し、最後にIUserStore.UpdateAsync(または.CreateAsync)を呼び出します。だからそれは単純にする必要があります:

public Task<int> IncrementAccessFailedCountAsync(Gebruiker user) 
{ 
    user.LoginTry++; 
    return Task.FromResult(user.LoginTry); 
} 
+0

最後に素晴らしいと便利な説明。それらのインターフェース上のgetters/setterの周りには混乱があります。 – contactmatt

関連する問題