Apa itu antarmuka <User> IUserSecurityStampStore dari ASP.NET Identity?

178

Melihat ASP.NET Identity (implementasi keanggotaan baru di ASP.NET), saya menemukan antarmuka ini ketika menerapkan sendiri 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);
    }
}

IUserSecurityStampStorediimplementasikan secara default EntityFramework.UserStore<TUser>yang pada dasarnya mendapatkan dan mengatur TUser.SecurityStampproperti.

Setelah beberapa penggalian lagi, tampak bahwa a SecurityStampadalah Guidyang baru dibuat pada titik-titik kunci dalam UserManager(misalnya, mengubah kata sandi).

Saya tidak bisa menguraikan lebih jauh dari ini karena saya sedang memeriksa kode ini di Reflector . Hampir semua simbol dan informasi async telah dioptimalkan.

Juga, Google tidak banyak membantu.

Pertanyaan adalah:

  • Apa itu SecurityStampASP.NET Identity dan apa gunanya?
  • Apakah SecurityStampperan apa pun saat cookie otentikasi dibuat?
  • Apakah ada konsekuensi keamanan atau tindakan pencegahan yang perlu diambil dengan ini? Misalnya, jangan mengirim nilai ini ke hilir ke klien?

Pembaruan (9/16/2014)

Kode sumber tersedia di sini:

Brian Chavez
sumber
1
@TryingToImprove, toko Identity baru dan middleware OWIN dependen dirancang agar sangat dapat disesuaikan. Seperti SimpleMembership, ada implementasi out-of-the-box yang memanfaatkan EF terbaru pada SQL Express. Tetapi Skema, metode kueri data, sumber basis data, dan bahkan barang tengah dapat disesuaikan di sekitar puprose spesifik Anda. Terlebih lagi, implementasi yang dirilis oleh MS sendiri masih terus berkembang. Itu sebabnya semua orang berjuang untuk menemukan definisi tertentu.
Dave Alperovich

Jawaban:

224

Ini dimaksudkan untuk mewakili potret kredensial pengguna Anda saat ini. Jadi jika tidak ada yang berubah, cap akan tetap sama. Tetapi jika kata sandi pengguna diubah, atau login dihapus (batalkan tautan akun google / fb Anda), cap akan berubah. Ini diperlukan untuk hal-hal seperti menandatangani secara otomatis pengguna / menolak cookie lama ketika ini terjadi, yang merupakan fitur yang datang di 2.0.

Identitas belum open source, masih dalam jalur pipa.

Sunting: Diperbarui untuk 2.0.0. Jadi tujuan utama dari SecurityStampini adalah untuk memungkinkan keluar di mana-mana. Ide dasarnya adalah bahwa setiap kali sesuatu yang berhubungan dengan keamanan diubah pada pengguna, seperti kata sandi, itu ide yang baik untuk secara otomatis membatalkan setiap cookie yang masuk yang ada, jadi jika kata sandi / akun Anda sebelumnya dikompromikan, penyerang tidak lagi memiliki akses.

Di 2.0.0 kami menambahkan konfigurasi berikut untuk mengaitkan OnValidateIdentitymetode di CookieMiddlewareuntuk melihat SecurityStampdan menolak cookie ketika telah berubah. Ini juga secara otomatis menyegarkan klaim pengguna dari database setiap refreshIntervaljika cap tidak berubah (yang menangani hal-hal seperti mengubah peran dll)

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

Jika aplikasi Anda ingin memicu perilaku ini secara eksplisit, itu dapat memanggil:

UserManager.UpdateSecurityStampAsync(userId);
Hao Kung
sumber
1
Bagaimana jika saya memigrasi data dari struktur tabel MVC4? Bisakah saya biarkan bidang itu kosong? Atau apakah itu akan mengacaukan segalanya?
Dmytro Shevchenko
1
Anda bisa mengembalikannya ID atau sesuatu yang konstan agar secara efektif membuatnya menjadi no-op. Null / "" mungkin akan bekerja juga.
Hao Kung
2
Apakah UserManager.UpdateSecurityStampAsync (userId) berfungsi untuk UseOAuthBearerTokens?
Rikard
7
Tidak, OAuthBearerTokens tidak terpengaruh saat ini.
Hao Kung
3
The UseCookieAuthenticationadalah usang sekarang. Saya berhasil mengonfigurasinya menggunakan services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch
11

UseCookieAuthentication sudah tidak digunakan lagi sekarang. Saya berhasil mengonfigurasinya menggunakan

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

Dipindahkan dari balasan ke jawaban per permintaan .

riezebosch
sumber
3
Apakah ini berfungsi jika saya menggunakan ASP.NET (bukan Core)? Saya bingung. Jika saya pergi ke Repo Asp Identity , itu mengatakan itu untuk Asp.NET Core.
El Mac
5

Saya mengamati SecurityStamp yang diperlukan untuk verifikasi token.

Untuk repo: Set SecurityStamp ke null di databsae Buat token (berfungsi ok) Verifikasi token (gagal)

KierenH
sumber
Itu pasti bug. Tidak masuk akal untuk menghasilkan token yang tidak dapat diverifikasi.
William T. Mallard
Bugnya adalah memungkinkan Anda menghasilkan token saat stempel keamanan kosong. (imho GenerateEmailConfirmationToken akan gagal jika tidak ada cap keamanan. Lihat jawaban ini: stackoverflow.com/a/29926407/1058214 )
mendel