2014-03-31 108 views
15

有沒有辦法撤銷例如用戶管理器在ASP NET Identity 2.0中生成的電子郵件確認令牌?

撤銷在ASP.NET身份2.0中由UserTokenProvider生成的令牌

語境
我想給用戶重新發送一個確認郵件的可能性。要做到這一點,我生成一個新的令牌:UserManager.GenerateEmailConfirmationTokenAsync(user.Id),併發送一個電子郵件與新生成的令牌。不幸的是,當我這樣做以前生成的令牌仍然工作,有沒有辦法撤銷他們?

實施例代碼
在的UserManager類:

manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("ASP.NET Identity")); 

在的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); 

約的存儲位置信息所生成的令牌和如何生成這些令牌也歡迎!

如果您能將此信息發送給我,我將不勝感激。

回答

25

默認的UserTokenProvider根據用戶的SecurityStamp生成令牌,所以直到更改(比如用戶密碼更改時),令牌將始終保持相同並保持有效。所以如果你想簡單地使舊的令牌失效,只需調用manager.UpdateSecurityStampAsync()。

+1

謝謝@HaoKung確實有效。對於需要更多有關SecurityStamp的工作信息的人,請查看** [本答案](http://stackoverflow.com/questions/19487322/what-is-asp-net-identitys-iusersecuritystampstoretuser-interface/19505060#19505060)* *也來自Hao Kung。 –

+2

@HaoKung我創建了多個令牌,並發現它們都不相同,並確認SecurityStamp從未改變過。我很困惑。它如何從SecurityStamp生成不變的令牌,以及所有這些不同的令牌如何工作? – Matthew

+2

令牌中不僅有郵票,它的自簽名幷包含令牌中的過期時間,因此如果您多次調用該令牌,它將不會生成相同的令牌。如果您希望它僅對安全印記保持穩定,則可以編寫自己的令牌提供程序。 –