2017-01-25 1 views
0

私は、私たちのサイトで複数のアクティブなセッションが許可されないようにする必要があります。パスワード変更の動作に影響を与えずに、ASP.NET ID 2.2.1で複数のアクティブなセッションを適切に防止するにはどうすればよいですか?

それは以下のようにあなたがCookieAuthenticationProviderのOnValidateIdentityプロパティのvalidateIntervalパラメータを操作することができるこれを行うには私の理解である:私はテストのために30分から0にデフォルト値を変更し、それが動作

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), //Changed from default of 30 minutes 
      regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
    } 

予想どおり。 2番目のブラウザにログインすると、最初のブラウザで実行された次の操作がログインページにリダイレクトされます。

私は、ユーザーが(ログイン後に)いつでもパスワードを変更できるようにしました。 validateIntervalプロパティをゼロに設定すると、ユーザーはパスワード変更を送信した直後にログアウトされます。その後、新しいパスワードでログインし直して、サイトを通常通り使用することができます。

validateIntervalパラメータの値を10秒と変更すると、ユーザーはパスワード変更を10秒間送信した後で現在のセッションを継続してからログインページにリダイレクトされます。 ManageControllerクラスののChangePasswordアクションインサイド

成功したパスワード変更後に実行されるデフォルトのコードはこれです:

if (result.Succeeded) 
{ 

    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
    if (user != null) 
    { 
     await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);      
    } 
    return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess }); 
} 

私はラインSignInManager.SignInAsyncもパスワードを通過するユーザのセッションを維持するだろうと思いました(Logout User From all Browser When Password is changedから)変更しますが、validateIntervalパラメータによって追加的に制御されているようです。

認証されたセッションでユーザーが再度ログインしなくてもパスワードを変更できるようにしたい場合は、ASP.NET IDでこれを行い、複数のアクティブなセッションを制御できますか? validateIntervalパラメータ(Prevent multiple logins)を変更せずに複数のアクティブなセッションを制御するより良い方法はありますか?

ありがとうございました。明確にするために、この動作が仕様である場合、私はそれで問題ありません。私はちょうど何が起こっているのか理解したいので、必要に応じて私の上司に行動を守ることができます。

編集:

私はまた、ログインアクションで経由SignInManagerサインインするセキュリティスタンプが直接前に更新することを言及しませんでした。

答えて

0

あなたがやっていることが、複数のアクティブなセッションを妨げるわけではありません。また、同じユーザーアカウントで複数の認証について話している「セッション」も想定しています。真の意味での複数のアクティブセッションは、全く異なる議論です。つまり、ユーザーの「認証済み」状態を維持するように設定されているCookieは、クライアント固有のものです。デスクトップコンピュータとモバイルデバイス、または同じコンピュータのChromeとInternet Explorerの両方からログオンしても、他のデバイスやブラウザで設定されている可能性のある他のCookieの影響を受けることなく、すべて異なるCookieになります。

あなたが真にこれを防ぐことができる唯一の方法は、何らかの形でユーザーを「ログイン」しているサーバーサイド(つまり、ユーザーテーブルの列など)としてマークすることです。その後、他の場所でそれらを認証する前に(基本的にあなたのサインインのポストアクションで)、あなたはこのフラグのための彼らのユーザーアカウントをチェックします。すでに設定されている場合は、元のデバイス/ブラウザで最初にログアウトするまで、ログインを拒否します。明らかに、ログアウトアクションはこのフラグを解除する必要があるため、別の場所で再度ログインすることが許可されます。

+0

私はオリジナルの投稿を編集しました。私は取っている追加のステップを省いた。私はFiddlerを使用して、第2のブラウザにログインした後、第1のブラウザにリクエストを再発行し、毎回自分のログインページにリダイレクトしています。 validateIntervalを0以外の値に変更すると、複数の認証が許可されます。 – user2564788

+0

このコードもまた、達成しようとしていることとは何の関係もありません。検証間隔をゼロに設定すると、すべての認証がすぐに無効になるため、ログインする機能が実質的に無効になります。あなたは複数の認証を防ぐことはできません。複数の認証を許可しない(つまり、0は決して1を超えない)という効果が得られる*認証が禁止されています。 –

+0

私はこの問題を混乱させると思います。私は現在、この環境をテスト環境で実行しており、認証や認証に問題はありません。パスワードを変更してすぐにログアウトするときだけです。 UserManagerメソッドChangePasswordAsyncが新しいセキュリティスタンプ(http://www.jamessturtevant.com/posts/ASPNET-Identity-Cookie-Authentication-Timeouts/)を生成していることがわかりました。それはゼロの間隔を確認することと関連して私を蹴飛ばしています。おそらく私はそれを防ぐことができると思ったが、それは内蔵されているようだ。助けてくれてありがとう。 – user2564788

関連する問題