1. ホーム
  2. asp.net

[解決済み】ASP.NET IdentityのIUserSecurityStampStore<TUser>インターフェースとは何ですか?

2022-04-14 02:39:20

質問

ASP.NET Identity (ASP.NETの新しいメンバーシップの実装) を見ていると、自分で実装するときにこのインターフェースに出会いました。 UserStore :

//Microsoft.AspNet.Identity.Core.dll

namespace Microsoft.AspNet.Identity
{ 
    public interface IUserSecurityStampStore<TUser> :
    {
        // Methods
        Task<string> GetSecurityStampAsync(TUser user);
        Task SetSecurityStampAsync(TUser user, string stamp);
    }
}

IUserSecurityStampStore は、デフォルトの EntityFramework.UserStore<TUser> を取得・設定するもので、基本的には TUser.SecurityStamp プロパティを使用します。

さらに調べてみると、どうやら SecurityStampGuid の要所要所で新たに生成される。 UserManager (例えば、パスワードの変更など)。

でこのコードを検証しているので、この先はあまり解読できません。 リフレクター . シンボルと非同期の情報はほとんどすべて最適化されています。

また、Googleもあまり協力的ではありません。

質問は

  • とは何ですか? SecurityStamp のASP.NET Identityで、どのような用途に使われるのですか?
  • を使用するのでしょうか? SecurityStamp は、認証クッキーが作成されるときに何らかの役割を果たしますか?
  • この場合、セキュリティ上の影響や注意点はありますか?例えば、この値をクライアントに下流に送らないようにするとか?

更新情報(2014/9/16)

ソースコードはこちらで公開しています。

解決方法は?

これは、ユーザーの資格情報の現在のスナップショットを表すことを意味します。 そのため、何も変更がなければ、スタンプは同じままです。 しかし、ユーザーのパスワードが変更されたり、ログインが削除された場合(google/fbアカウントのリンクを解除)、スタンプは変更されます。 これは、このような場合に自動的にユーザーに署名する/古いクッキーを拒否するなどのために必要で、2.0に搭載される機能です。

Identityはまだオープンソースではなく、現在はまだ準備中である。

編集:2.0.0用に更新しました。 ということは、主な目的は SecurityStamp は、どこでもサインアウトできるようにするためのものです。 基本的な考え方は、セキュリティに関連する何かがパスワードのようにユーザ上で変更されるときはいつでも、既存のサインインクッキーを自動的に無効にするのが良い考えだということで、パスワードやアカウントが以前に漏洩した場合、攻撃者はもはやアクセスすることができません。

2.0.0では、以下のような設定を追加し、フックするようにしました。 OnValidateIdentity メソッドを CookieMiddleware を見るために SecurityStamp を作成し、変更された場合はクッキーを拒否する。 また、ユーザーの主張をデータベースから自動的にリフレッシュするために、毎回の refreshInterval スタンプに変更がない場合(ロールの変更などにも対応します)

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(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

もし、アプリがこの動作を明示的に引き起こしたい場合は、呼び出すことができます。

UserManager.UpdateSecurityStampAsync(userId);