web-dev-qa-db-ja.com

古いセッションCookieを無効にする-ASP.Net Identity

外部の会社が、現在取り組んでいる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");
    }
_
23
MrBliz

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を再生成してタイムスタンプを更新します。

9
trailmax

Trailmaxの答えは正解です。誰かが ASP.NET Boilerplate も使用しているときにこれを実行しようとすると、次のようになります。

app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());

私はもともと持っていました:

app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());

動作していませんでした。

0
greggor01