检查身份电子邮件令牌有效性

时间:2018-08-02 10:26:28

标签: c# asp.net-core asp.net-core-identity

我有一个.net核心应用程序,在注册后我会在其中创建一个电子邮件令牌,然后通过电子邮件发送该令牌。 想法是,用户可以在客户端应用程序中附带该电子邮件令牌,而我想检查它的有效性(如果过期了,如果它是与给定电子邮件关联的正确令牌)。

我试图在userManager中找到我可以使用的任何方法。我发现的是VerifyUserTokenAsync(ApplicationUser user, string tokenProvider, string purpose, string token),但我不知道要在参数中传递什么。

因此,任何人都可以帮助tokenProviderpurpose 我想提到的是,电子邮件令牌是使用GenerateEmailConfirmationTokenAsync生成的。我可以使用ConfirmEmailAsync检查令牌,如果结果不成功,则令牌无效,但是如果令牌有效,我不想将EmailConfirmed设置为true。

1 个答案:

答案 0 :(得分:2)

解决此问题的一种有用方法是查看ConfirmEmailAsync中的implementation

public virtual async Task<IdentityResult> ConfirmEmailAsync(TUser user, string token)
{
    // ...
    if (!await VerifyUserTokenAsync(user, Options.Tokens.EmailConfirmationTokenProvider, ConfirmEmailTokenPurpose, token))
    {
        return IdentityResult.Failed(ErrorDescriber.InvalidToken());
    }
    // ...
}

如预期的那样,ConfirmEmailAsync呼叫VerifyUserTokenAsync。使用tokenProvider类本身的属性提供传递给此方法的第二个和第三个参数(purposeUserManager)。再次查看源代码,很明显OptionsConfirmEmailTokenPurpose都是公开的:

public const string ConfirmEmailTokenPurpose = "EmailConfirmation";
// ...    
public IdentityOptions Options { get; set; }

鉴于所有这些,您可以像这样呼叫VerifyUserTokenAsync

await userManager.VerifyUserTokenAsync(
    userYouAlreadyHave,
    userManager.Options.Tokens.EmailConfirmationTokenProvider,
    userManager.ConfirmEmailTokenPurpose,
    tokenYouAlreadyHave);

如果此调用返回true,则该令牌有效。