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


178

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ます。

さらに掘り下げた後、a SecurityStampはのGuid重要なポイントで新しく生成されたようですUserManager(たとえば、パスワードの変更)。

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

また、Googleはあまり役に立ちませんでした。

質問は:

  • 何がSecurityStampASP.NETアイデンティティで、それがために使用何ですか?
  • SecurityStamp認証Cookieが作成されるときに、は何らかの役割を果たしますか?
  • これを使用する必要があるセキュリティの影響または予防策はありますか?たとえば、この値を下流のクライアントに送信しませんか?

アップデート(2014年9月16日)

ここで入手可能なソースコード:


1
@TryingToImprove、新しいIDストアと依存OWINミドルウェアは高度にカスタマイズできるように設計されています。SimpleMembershipと同様に、SQL Expressの最新のEFを利用した、すぐに使用可能な実装があります。しかし、スキーマ、データクエリ方法、データベースソース、さらにはミドルウェアでさえ、特定のププローズを中心にカスタマイズできます。さらに、MSによってリリースされた実装自体はまだ進化しています。だからこそ、誰もが特定の定義を見つけるのに苦労しています。
デイブアルペロビッチ2014

回答:


224

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

Identityはまだオープンソースではありませんが、現在パイプラインに入っています。

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

2.0.0では、次の設定を追加して、にOnValidateIdentityメソッドをフックし、Cookieが変更されたときにCookie 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);

1
MVC4テーブル構造からデータを移行する場合はどうなりますか?そのフィールドを空白のままにすることはできますか?それとも、何かを台無しにするつもりですか?
Dmytro Shevchenko

1
IDまたは定数を返して、効果的に何もしないようにすることができます。null / ""もおそらく機能します。
Hao Kung

2
UserManager.UpdateSecurityStampAsync(userId)はUseOAuthBearerTokensに対して機能しますか?
リカルド、2014年

7
いいえ、現在、OAuthBearerTokensは影響を受けません。
Hao Kung 2014年

3
UseCookieAuthenticationされる非推奨になりましたで。私はそれを使ってなんとか構成することができましたservices.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));
riezebosch 2017

11

UseCookieAuthenticationは非推奨になりました。私はそれを使ってそれを構成することができました

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

リクエストごとに返信から回答に移動しました。


3
ASP.NET(コアではない)を使用している場合、これは機能しますか?私は混乱しています。Asp Identity Repo にアクセスすると、Asp.NET Core用だと表示されます。
エル・マック

5

SecurityStampがトークン検証に必要であることがわかりました。

リポジトリを作成するには、databsaeでSecurityStampをnullに設定します。トークンを生成します(正常に機能します)トークンを確認します(失敗します)


それはバグです。検証できないトークンを生成しても意味がありません。
ウィリアムT.マラード

バグは、セキュリティスタンプが空白の場合にトークンを生成できることです。(セキュリティスタンプがない場合、imho GenerateEmailConfirmationTokenは失敗するはずです。この回答を参照してください:stackoverflow.com/a/29926407/1058214
mendel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.