撤消ASP.NET Identity 2.0中UserTokenProvider生成的令牌

Jim*_*erg 17 c# asp.net asp.net-mvc-5 asp.net-identity

有没有办法撤销ASP NET Identity 2.0中用户管理器生成的电子邮件验证令牌?

上下文
我想让用户重新发送确认电子邮件.为此,我使用:生成一个新令牌UserManager.GenerateEmailConfirmationTokenAsync(user.Id),并使用新生成的令牌发送电子邮件.不幸的是,当我这样做时,以前生成的令牌仍在工作,有没有办法撤销它们?

示例代码
在UserManager类中:

manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("ASP.NET Identity"));
Run Code Online (Sandbox Code Playgroud)

在AccountController中:

var user = await UserManager.FindByEmailAsync("email");

// All generated tokens below will work to confirm the email. 
// I only want the last token to be valid when confirming the email address.
var token1 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token2 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token3 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token4 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var token5 = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

var result = await UserManager.ConfirmEmailAsync(user.Id, token5);
Run Code Online (Sandbox Code Playgroud)

还欢迎有关生成的令牌的存储位置以及如何生成这些令牌的信息!

如果您能将此信息发送给我,我将不胜感激.

Hao*_*ung 27

默认的UserTokenProvider根据用户的SecurityStamp生成令牌,因此在更改之前(例如用户的密码更改时),令牌将始终相同,并保持有效.因此,如果您想简单地使旧令牌无效,只需调用manager.UpdateSecurityStampAsync().

  • 谢谢@HaoKung 这确实有效。对于需要有关 SecurityStamp 检查工作的更多信息的人 **[这个答案](http://stackoverflow.com/questions/19487322/what-is-asp-net-identitys-iusersecuritystampstoretuser-interface/19505060#19505060)* * 也来自郝公。 (2认同)
  • @HaoKung我创建了多个令牌,发现它们都不同,并确认SecurityStamp从未改变过.我很迷惑.它是如何从不改变的SecurityStamp生成不同的标记,以及所有这些不同的标记如何工作​​的? (2认同)
  • 令牌中不仅包含戳记,其自签名并包含令牌中的过期时间,因此如果您多次调用它,它将不会生成相同的令牌.如果您希望它仅对安全标记稳定,您可以编写自己的令牌提供程序. (2认同)