197

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);
    }
}

IUserSecurityStampStoreEntityFramework.UserStore<TUser>基本的にプロパティを取得および設定するデフォルトで実装されていTUser.SecurityStampます。

さらに掘り下げると、は の重要なポイント(パスワードの変更など)で新しく生成された でSecurityStampあることがわかります。GuidUserManager

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

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

質問は次のとおりです。

  • SecurityStampASP.NET Identityの とは何ですか? また、何に使用されますか?
  • SecurityStamp認証 Cookie が作成されるときに何らかの役割を果たしますか?
  • これに関して講じる必要があるセキュリティ上の影響や予防策はありますか? たとえば、この値をダウンストリームのクライアントに送信しませんか?

更新 (2014 年 9 月 16 日)

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

4

3 に答える 3

244

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

Identity はまだオープン ソースではなく、現在もパイプラインにあります。

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

2.0.0 では、次の構成を追加して、 のOnValidateIdentityメソッドをフックし、変更されたときに CookieCookieMiddlewareを確認して拒否しました。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);
于 2013-10-21T21:26:45.217 に答える
5

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

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

于 2015-07-23T02:24:02.270 に答える