Giao diện IUserSecurityStampStore <TUser> của ASP.NET Identity là gì?


178

Nhìn vào ASP.NET Identity (triển khai thành viên mới trong ASP.NET), tôi đã bắt gặp giao diện này khi thực hiện giao diện của riêng tôi 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được thực hiện theo mặc định EntityFramework.UserStore<TUser>mà về cơ bản là lấy và đặt thuộc TUser.SecurityStamptính.

Sau khi đào thêm, có vẻ như SecurityStampmột Guidcái mới được tạo tại các điểm chính trong UserManager(ví dụ: thay đổi mật khẩu).

Tôi thực sự không thể giải mã được nhiều hơn thế vì tôi đang kiểm tra mã này trong Reflector . Hầu như tất cả các thông tin biểu tượng và không đồng bộ đã được tối ưu hóa.

Ngoài ra, Google đã không được giúp đỡ nhiều.

Câu hỏi là:

  • Một SecurityStamptrong Nhận dạng ASP.NET là gì và nó được sử dụng để làm gì?
  • SecurityStampđóng vai trò nào khi cookie xác thực được tạo không?
  • Có bất kỳ phân nhánh bảo mật hoặc biện pháp phòng ngừa nào cần được thực hiện với điều này? Ví dụ: không gửi giá trị này xuống cho khách hàng?

Cập nhật (ngày 16/9/2014)

Mã nguồn có sẵn ở đây:


1
@TryingToImprove, cửa hàng Nhận dạng mới và phần mềm trung gian OWIN phụ thuộc được thiết kế để có thể tùy chỉnh cao. Giống như SimpleMembership, có một out-of-the-box thực hiện tận dụng EF mới nhất về SQL Express. Nhưng Schema, phương thức truy vấn dữ liệu, nguồn cơ sở dữ liệu và thậm chí cả kho trung gian có thể tùy chỉnh xung quanh con rối cụ thể của bạn. Hơn nữa, việc triển khai bởi MS vẫn đang phát triển. Đó là lý do tại sao mọi người đấu tranh để tìm một định nghĩa cụ thể.
Dave Alperovich

Câu trả lời:


224

Điều này có nghĩa là để thể hiện ảnh chụp nhanh hiện tại của thông tin người dùng của bạn. Vì vậy, nếu không có gì thay đổi, tem sẽ giữ nguyên. Nhưng nếu mật khẩu của người dùng bị thay đổi hoặc đăng nhập bị xóa (hủy liên kết tài khoản google / fb của bạn), tem sẽ thay đổi. Điều này là cần thiết cho những việc như tự động đăng nhập người dùng / từ chối cookie cũ khi điều này xảy ra, đây là một tính năng có trong 2.0.

Danh tính chưa phải là nguồn mở, hiện tại nó vẫn đang trong quá trình xử lý.

Chỉnh sửa: Cập nhật cho 2.0.0. Vì vậy, mục đích chính của việc SecurityStampnày là cho phép đăng xuất ở mọi nơi. Ý tưởng cơ bản là bất cứ khi nào một cái gì đó liên quan đến bảo mật được thay đổi trên người dùng, như mật khẩu, bạn nên tự động vô hiệu hóa bất kỳ cookie đăng nhập hiện có nào, vì vậy nếu mật khẩu / tài khoản của bạn bị xâm phạm trước đó, kẻ tấn công không còn quyền truy cập.

Trong 2.0.0, chúng tôi đã thêm cấu hình sau để móc OnValidateIdentityphương thức vào CookieMiddlewaređể xem SecurityStampvà từ chối cookie khi nó đã thay đổi. Nó cũng tự động làm mới các khiếu nại của người dùng từ cơ sở dữ liệu mỗi refreshIntervalkhi tem không thay đổi (sẽ xử lý các việc như thay đổi vai trò, v.v.)

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

Nếu ứng dụng của bạn muốn kích hoạt hành vi này một cách rõ ràng, nó có thể gọi:

UserManager.UpdateSecurityStampAsync(userId);

1
Nếu tôi đang di chuyển dữ liệu từ cấu trúc bảng MVC4 thì sao? Tôi có thể để trống trường đó không? Hoặc là nó sẽ làm hỏng mọi thứ?
Dmytro Shevchenko

1
Bạn có thể yêu cầu nó trả lại ID hoặc một cái gì đó không đổi để có hiệu quả làm cho nó không hoạt động. Null / "" có thể sẽ hoạt động tốt.
Hao Kung

2
UserManager.UpdateSecurityStampAsync (userId) có hoạt động với UseOAuthBearerTokens không?
Rikard

7
Không, OAuthBearerTokens hiện không bị ảnh hưởng.
Hao Kung

3
Các UseCookieAuthenticationđang bị phản đối bởi bây giờ. Tôi quản lý để cấu hình nó bằng cách sử dụng services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch

11

Hiện tại UseCookieAuthentication không được dùng nữa . Tôi quản lý để cấu hình nó bằng cách sử dụng

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

Chuyển từ trả lời để trả lời theo yêu cầu .


3
Nó có hoạt động không nếu tôi đang sử dụng ASP.NET (không phải Core)? Tôi bị bối rối. Nếu tôi đi đến Asp nhận dạng Repo, nó nói nó cho Asp.NET Core.
El Mac

5

Tôi đã quan sát SecurityStamp được yêu cầu xác minh mã thông báo.

Để repo: Đặt SecurityStamp thành null trong databsae Tạo mã thông báo (hoạt động ổn) Xác minh mã thông báo (không thành công)


Đó phải là một lỗi. Thật vô nghĩa khi tạo mã thông báo không thể xác minh được.
William T. Mallard

Lỗi là nó cho phép bạn tạo mã thông báo khi tem bảo mật trống. (imho GenerateEmailConf ConfirmationToken sẽ thất bại nếu không có tem bảo mật. Xem câu trả lời này: stackoverflow.com/a/29926407/1058214 )
mendel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.