2017-10-19 8 views
0

管理者が他のユーザーを禁止できるIdentity 2.0を使用してアプリケーションを作成しています。彼らがそれらを禁止するとき、彼らはサインアウトされる(彼らが次の行動/要求をするとき)。 UpdateSecuritStampAsyncがログアウト一部を行いASP.NET MVCユーザーがログアウトしたときのメッセージを表示

public async Task<ActionResult> Block(ApplicationUser formuser, string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var user = await UserManager.FindByIdAsync(id); 
     user.DeleteDate = DateTime.Now; 
     user.IsConfirmed = false; 
     await UserManager.UpdateSecurityStampAsync(user.Id); 
     return RedirectToAction("Index"); 
    } 

は、ここに私の禁止行為です。また、Startup.Auth.cs UseCookieAuthenticationを挿入すると、ユーザーがログアウトするように変更されているので、それが良いと思います(重要なものを追加できない場合は、コメントを書いて追加します)

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 

デフォルトのTimeSpanを30分から0に変更しました(これは間違いかもしれませんが動作します)。 このスレッドの主な質問は、ユーザーがログアウトしたときにメッセージを表示する場所を作成したいのですが、どうすればよいでしょうか? (管理者がユーザーをブロックすると、ユーザーがページをリロードした後、悪用などでブロックされたというメッセージが表示されます)

答えて

1

セキュリティスタンプを更新する代わりにユーザーをロック/ロック解除します。 How to lock and unlock account in Asp.Net Identity providerをご覧ください。

public virtual async Task<IdentityResult> LockUserAccount(string userId, int? forDays) 
{ 
    var result = await this.SetLockoutEnabledAsync(userId, true); 
    if (result.Succeeded) 
    { 
     if (forDays.HasValue) 
     { 
      result = await SetLockoutEndDateAsync(userId, DateTimeOffset.UtcNow.AddDays(forDays.Value)); 
     } 
     else 
     { 
      result = await SetLockoutEndDateAsync(userId, DateTimeOffset.MaxValue); 
     } 
    } 
    return result; 
} 

public virtual async Task<IdentityResult> UnlockUserAccount(string userId) 
{ 
    var result = await this.SetLockoutEnabledAsync(userId, false); 
    if (result.Succeeded) 
    { 
     await ResetAccessFailedCountAsync(userId); 
    } 
    return result; 
} 

そして、あなたのログインアクションまたはプロバイダにあなたは私が彼/彼女はあなたがドンので、ログインしようとせずにすぐにlockedoutされた後にユーザに通知するかどうかはわかりません

if (userManager.IsLockedOut(userId)) 
{ 
    context.SetError("invalid_grant", "The account is locked out of the system."); 
    return; 
} 

を使用したいです」ユーザーがログインページにリダイレクトされるまでに、ユーザーのIDまたはユーザー名を保持しています。しかし、そうした場合は、単にIsLockedOutメソッドを使用して、ユーザーに何を伝えたいかを示すポップアップを表示するかどうかを決めることができます。

+0

しかし、このメソッドは数日間ロックアウトしますが、私のメソッドは誰かがブロック解除するまでブロックします(実際にどれくらい時間がかかるか分からないため)。そのようなことをしているあなたに問題がありますか? – HighSepton

+0

誰かを無期限にロックしておき、いつでもロックを解除することができます。ただし、 'forDays'はヌル可能です。既に組み込まれているので、ホイールを再発明しようとしないことをお勧めします。 –

+0

大丈夫、まあ、私はそれを変更しようとします。しかし、これは本当に私の質問に答えるものではない。 – HighSepton

関連する問題