2014-10-02 27 views
7

Chúng tôi đang làm việc trên một ứng dụng ASP.NET MVC 4.1 mới. Chúng tôi đang tìm kiếm các công cụ ASP.NET Identity và chúng tôi đang gặp khó khăn với mã thông báo để đặt lại mật khẩu và lời mời mới. Tôi dường như không thể tìm thấy một cách để thiết lập thời gian hết hạn cho các thẻ được tạo ra, và nó dường như được thiết lập ở khoảng 10 phút theo mặc định. Chúng tôi đang sử dụng EmailTokenProvider làm nhà cung cấp mã thông báo người dùng vì nó có vẻ hoạt động tốt với dấu bảo mật trên người dùng.Cách đặt hết hạn mã thông báo UserTokenProvider

Làm cách nào chúng tôi có thể đặt thời hạn cho mã thông báo - lý tưởng là chúng tôi muốn đặt mã thông báo khác nhau cho lời mời So với mã thông báo đặt lại mật khẩu.

quản lý người dùng của chúng tôi trông như thế này:

var manager = new UserManager<User, long>(new UserStore(new UserRepository())); 
manager.UserValidator = new UserValidator<User, long>(manager) {AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true}; 
manager.UserTokenProvider = new EmailTokenProvider<User, long>(); 

Khi người dùng yêu cầu một liên kết mật khẩu reset chúng ta gọi là

var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id); để có mã thông báo, và thông qua đó trên cho người dùng.

Khi một người dùng được mời, chúng ta gọi là:

var token = await _userManager.GenerateUserTokenAsync("FirstLogin", user.Id);

để có mã thông báo và gửi.

Trả lời

2

Việc triển khai mặc định của nhà cung cấp thẻ trong 2.0 không cho phép bạn thay đổi token hết hạn, đây là điều chúng tôi đang xem xét cho bản sắc 3.0.

+1

Cảm ơn bạn đã cập nhật. Tôi thấy rằng việc sử dụng 'DataProtectorTokenProvider' là một lựa chọn tốt hơn, cho thời lượng lâu hơn của mã thông báo. –

+1

Điều này là vô giá trị, thậm chí không có bất kỳ tài liệu nào về thời gian hết hạn tùy ý này. – Cloud

+0

@ hao-kung bạn có thể chia sẻ thời gian hết hạn mã thông báo đặt lại mặc định không? – vmachacek

1

Nếu tôi hiểu câu hỏi của bạn tốt, sau đây có thể giúp:

private static string CalculateToken(User user) 
    { 
     byte[] time = BitConverter.GetBytes(DateTime.UtcNow.ToBinary()); 
     byte[] key = BitConverter.GetBytes(user.ID); 
     string token = Convert.ToBase64String(time.Concat(key).ToArray()); 
     return token; 
    } 

Và sau đó:

DateTime time = DateTime.FromBinary(BitConverter.ToInt64(data, 0)); 
    int id = BitConverter.ToInt32(data, 8); 

    if (time< DateTime.UtcNow.AddMinutes(-10) || user.ID != id) 
      { 
       //too old or IDs not matching 
      } 
Các vấn đề liên quan