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
によって実装されます。
さらに掘り下げてみると、SecurityStamp
はGuid
のキーポイントで新たに生成されたUserManager
(たとえば、パスワードの変更)のようです。
Reflectorでこのコードを調べているので、これ以上は本当に解読できません。ほとんどすべてのシンボルと非同期情報が最適化されています。
また、Googleはあまり助けになっていません。
SecurityStamp
とは何ですか?SecurityStamp
は何らかの役割を果たしますか?ここで利用可能なソースコード:
これは、ユーザーの資格情報の現在のスナップショットを表すためのものです。したがって、何も変わらない場合、スタンプは同じままです。ただし、ユーザーのパスワードが変更された場合、またはログインが削除された場合(google/fbアカウントのリンクを解除した場合)、スタンプは変更されます。これは、ユーザーに自動的に署名する、これが発生したときに古いCookieを拒否するなど、2.0で導入される機能に必要です。
アイデンティティはまだオープンソースではなく、現在パイプラインにあります。
編集:2.0.0用に更新したがって、SecurityStamp
の主な目的は、どこでもサインアウトを有効にすることです。基本的な考え方は、パスワードなどのセキュリティ関連の何かがユーザーで変更されるたびに、Cookie内の既存のサインを自動的に無効にすることをお勧めします。したがって、パスワード/アカウントが以前に侵害された場合、攻撃者はアクセスできなくなります。
2.0.0では、OnValidateIdentity
のCookieMiddleware
メソッドをフックして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);
SecurityStampがトークンの検証に必要であることを確認しました。
レポジトリ:データベースでSecurityStampをnullに設定しますトークンを生成します(正常に動作します)トークンを検証します(失敗します)