3

I am trying to implement a short code (6digits) for Email Confirmation using Asp.Net Identity Core.

Currently, I am using the existing implementation which is TotpSecurityStampBasedTokenProvider .

Everything works fine, it generates the 6 digit code that I want using this line of code var token = await _userManager.GenerateUserTokenAsync(user, "EmailTokenProvider", "EmailConfirmation"); ,

it also verifies if the code entered is valid or not using this method here var isValid = await _userManager.VerifyUserTokenAsync(user, "EmailTokenProvider", "EmailConfirmation", token);.

My problem is, when I am trying to call the method await _userManager.ConfirmEmailAsync(user, token); it says InvalidToken, do I need to implement my own ConfirmEmailAsync? As I also dig deep into it, it calls the SetEmailConfirmedAsync, do I also need to override the current implementation for that by creating my own custom IUserEmailStore?

Thanks!

Here are some of the sample references: Implement email confirmation with digit code, Custom Verification Code/Token in Asp .Net Identity

2
  • Could you share a little more code? Unfortunately the github link you posted 404's out for me. Things that come to mind: 1. It seems as though you are generating good tokens, do you save them down to a data store yourself or is there a package you are using that does this for you? 2. If this package didn't create tables for you to store the tokens, it is very likely you will have to write your own ConfirmEmailAsync function. Commented Mar 23, 2022 at 18:29
  • The link you provided is 404, So I can only make a simple judgment based on your question, In my opinion, this question may caused by encode and decode of verification tokens, So you can try to refer to this link. Commented Mar 24, 2022 at 6:02

2 Answers 2

1

Try this

var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

Instead of

var token = await _userManager.GenerateUserTokenAsync(user, "EmailTokenProvider", "EmailConfirmation");

Click Documentation

Sign up to request clarification or add additional context in comments.

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
1

We have to tell Identity what token providers we want to use for the different kinds of tokens to make the UserManager-convenience methods like GenerateEmailConfirmationTokenAsync() or ConfirmEmailAsync() use a specific provider.

We do this by configuring the identity TokenOptions:

builder.Services.Configure<IdentityOptions>(options =>
{
    // Token settings.
    options.Tokens.EmailConfirmationTokenProvider = "MyCustomEmailTokenProvider";
    ...
});

Or together when registering the new provider using the fluent API:

services.AddDefaultIdentity<ApplicationUser>(options =>
    {
        options.Tokens.EmailConfirmationTokenProvider = "MyCustomEmailTokenProvider"
    })
    .AddTokenProvider<MyCustomEmailConfirmationTokenProvider>("MyCustomEmailTokenProvider");

There also exist few token providers that gets added by default by .AddDefaultTokenProviders() that can be used without registering any additional providers by using their names:

  • TokenOptions.DefaultProvider, uses DataProtectorTokenProvider (the default provider used when no explicit configuration exist
  • TokenOptions.DefaultEmailProvider uses EmailTokenProvider
  • TokenOptions.DefaultPhoneProvider uses PhoneNumberTokenProvider
  • TokenOptions.DefaultAuthenticatorProvider uses AuthenticatorTokenProvider

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.