ASP.NET Identity 2.2.1 - 发送带有代码的确认电子邮件,而不是带有链接

Mis*_*siu 6 c# asp.net asp.net-web-api asp.net-identity-2

我已经使用 ASP.NET Identity 2.2.1 成功构建了简单的注册系统。
我只需要 API,所以我构建了允许使用 route 创建帐户的简单控制器account/create,当创建帐户时,用户会收到带有确认电话所需的令牌的 SMS 消息,同时我生成验证电子邮件地址所需的链接,我正在将其发送到用户电子邮件地址。然后用户需要从 SMS 输入令牌(向 请求account/confirm_phone)并单击他收到的电子邮件中的链接。
激活账户需要这两个操作,这部分工作正常。

我需要将电子邮件链接更改为电子邮件令牌,类似于用于确认电话号码的令牌,因此用户不必单击链接,而是必须输入该令牌(请求到account/confirm_email)

方法GenerateEmailConfirmationTokenAsync返回很长的代码,成为电子邮件中发送的链接的一部分,我希望它返回 6 位令牌。

我无法重用,GeneratePhoneConfirmationTokenAsync因为这将生成与通过 SMS 发送相同的令牌。

我在互联网上搜索过,但找不到任何关于如何自定义GenerateEmailConfirmationTokenAsync方法生成的令牌的信息。

是否可以配置该令牌生成器,以便它返回 6(或任何可配置长度)数字代码,我可以用它来确认用户电子邮件地址。

我知道将链接发送给用户是更好的选择,但正如我写的那样,这是我得到的要求,我无法改变它。

pat*_*ski 0

这可能不是那么容易,但实现它的方法是编写您自己的 IUserTokenProvider 实现。

public class CustomTokenProvider : IUserTokenProvider<ApplicationUser, string>
{
    public Task<string> GenerateAsync(string purpose, UserManager<ApplicationUser, string> manager, ApplicationUser user)
    {
        ???
    }

    public Task<bool> IsValidProviderForUserAsync(UserManager<ApplicationUser, string> manager, ApplicationUser user)
    {
        ???
    }

    public Task NotifyAsync(string token, UserManager<ApplicationUser, string> manager, ApplicationUser user)
    {
        ???
    }

    public Task<bool> ValidateAsync(string purpose, string token, UserManager<ApplicationUser, string> manager, ApplicationUser user)
    {
        ???
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 ApplicationUserManager 的 Create 方法中:

manager.UserTokenProvider = new CustomTokenProvider<ApplicationUser, string>();
Run Code Online (Sandbox Code Playgroud)