2014-10-02 46 views
7

我们正在开发一个新的ASP.NET MVC 4.1应用程序。我们正在关注ASP.NET身份,我们正在努力使用令牌来重置密码和新邀请。我似乎无法找到一种方法来设置生成的令牌的到期时间,并且它似乎默认设置为大约10分钟。我们使用EmailTokenProvider作为用户令牌提供程序,因为它似乎与用户的安全印记一起工作良好。如何设置UserTokenProvider令牌过期

我们如何设置令牌到期 - 理想情况下,我们希望为邀请对重置密码令牌设置不同的值。

我们的用户管理器看起来是这样的:

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

当用户请求重置密码链接我们称之为

var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id);获得令牌,并传递到用户。

当用户被邀请,我们称之为:

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

获得令牌,并发送。

回答

2

在2.0令牌提供程序的默认实现不允许你改变令牌到期,这是我们正在考虑的身份3.0。

+1

感谢您的更新。我发现使用'DataProtectorTokenProvider'是更好的选择,因为令牌的寿命更长。 – 2014-10-16 15:30:40

+1

这是非常没有价值的,甚至没有任何文档在这个任意的到期时间。 – Cloud 2014-10-17 12:29:10

+0

@ hao-kung你可以请分享什么是默认的重置密码令牌过期时间? – vmachacek 2016-07-12 15:46:19

1

如果我明白你的问题很好,下面可以帮助:

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

然后:

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 
      }