外部の会社が、現在取り組んでいるASP.NET MVC 5アプリケーションでいくつかの侵入テストを行っています。
彼らが提起した問題は以下のとおりです
セッション管理にリンクされたCookieは、AspNet.ApplicationCookieと呼ばれます。手動で入力すると、アプリケーションはユーザーを認証します。ユーザーがアプリケーションからログアウトしても、Cookieは引き続き有効です。つまり、古いセッションCookieを無制限の時間枠内で有効な認証に使用できます。古い値が挿入されると、アプリケーションはそれを受け入れ、新しく生成されたCookieに置き換えます。したがって、攻撃者が既存のCookieの1つにアクセスすると、以前と同じアクセスで有効なセッションが作成されます。
ASP.NEt Identity 2.2を使用しています
これがアカウントコントローラでのログアウトアクションです
_ [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Account");
}
_
startup.auth.cs
_ app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(24.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, int>(
validateInterval: TimeSpan.FromMinutes(1.0),
regenerateIdentityCallback: (manager, user) =>
user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (Int32.Parse(id.GetUserId())))
}
});
_
フレームワークは古いセッションCookieの無効化を処理するが、Owin.Securityソースコードを閲覧することはできないと考えていたでしょう。
ログアウト時にセッションCookieを無効にするにはどうすればよいですか?
編集 Jamie Dunstan のアドバイスAuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
を追加しましたが、違いはありません。それでも、アプリケーションからログアウトし、以前に認証されたリクエストをFiddlerで複製して、アプリケーションに受け入れさせることができます。
編集:更新したログオフメソッド
_ [HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> LogOff()
{
var user = await UserManager.FindByNameAsync(User.Identity.Name);
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
await UserManager.UpdateSecurityStampAsync(user.Id);
return RedirectToAction("Login", "Account");
}
_
Jamieの提案どおりにAuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie);
を使用してください。
同じcookieを使用して再度ログインできるようにすることは、仕様によるものです。 Identityは、ログインしているすべてのユーザーを追跡する内部セッションを作成せず、OWINがすべてのボックスにヒットするCookie(つまり、前のセッションからのコピー)を取得した場合、ログインを許可します。
セキュリティスタンプが更新された後もログインできる場合は、OWINがApplicationUserManager
を取得できない可能性があります。 _app.UseCookieAuthentication
_のすぐ上にこの行があることを確認してください
_app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
_
または、DIを使用している場合は、DIからApplicationUserManager
を取得します。
_app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());
_
また、validateInterval: TimeSpan.FromMinutes(30)
の値を小さくします。通常は数分で十分です。 Identityがauth-cookieの値とデータベースの値を比較する頻度です。比較が完了すると、IdentityはCookieを再生成してタイムスタンプを更新します。
Trailmaxの答えは正解です。誰かが ASP.NET Boilerplate も使用しているときにこれを実行しようとすると、次のようになります。
app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());
私はもともと持っていました:
app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());
動作していませんでした。