web-dev-qa-db-ja.com

ASP.NET IdentityのIUserSecurityStampStore <TUser>インターフェイスとは何ですか?

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(たとえば、パスワードの変更)のようです。

Reflectorでこのコードを調べているので、これ以上は本当に解読できません。ほとんどすべてのシンボルと非同期情報が最適化されています。

また、Googleはあまり助けになっていません。

質問は次のとおりです。

  • ASP.NET IdentityのSecurityStampとは何ですか?
  • 認証Cookieの作成時にSecurityStampは何らかの役割を果たしますか?
  • これに伴うセキュリティ上の影響や注意事項はありますか?たとえば、この値をクライアントにダウンストリームで送信しませんか?

更新(2014年9月16日)

ここで利用可能なソースコード:

163
Brian Chavez

これは、ユーザーの資格情報の現在のスナップショットを表すためのものです。したがって、何も変わらない場合、スタンプは同じままです。ただし、ユーザーのパスワードが変更された場合、またはログインが削除された場合(google/fbアカウントのリンクを解除した場合)、スタンプは変更されます。これは、ユーザーに自動的に署名する、これが発生したときに古いCookieを拒否するなど、2.0で導入される機能に必要です。

アイデンティティはまだオープンソースではなく、現在パイプラインにあります。

編集:2.0.0用に更新したがって、SecurityStampの主な目的は、どこでもサインアウトを有効にすることです。基本的な考え方は、パスワードなどのセキュリティ関連の何かがユーザーで変更されるたびに、Cookie内の既存のサインを自動的に無効にすることをお勧めします。したがって、パスワード/アカウントが以前に侵害された場合、攻撃者はアクセスできなくなります。

2.0.0では、OnValidateIdentityCookieMiddlewareメソッドをフックしてSecurityStampを調べ、Cookieが変更されたときに拒否するように、次の構成を追加しました。また、スタンプが変更されていない場合(役割の変更などを処理します)、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);
208
Hao Kung

UseCookieAuthenticationは 非推奨 です。私はそれを使用して設定することができました

services.Configure<SecurityStampValidatorOptions>(o => 
    o.ValidationInterval = TimeSpan.FromSeconds(10));

request ごとに返信から回答に移動しました。

4
riezebosch

SecurityStampがトークンの検証に必要であることを確認しました。

レポジトリ:データベースでSecurityStampをnullに設定しますトークンを生成します(正常に動作します)トークンを検証します(失敗します)

3
KierenH