应用网址中的电子邮件验证代码(部署在蔚蓝上)找不到端点

时间:2018-08-29 12:16:27

标签: azure asp.net-core email-confirmation

我具有.net核心身份电子邮件验证端点设置,如下所示:

/api/[controller]/{userId}/{emailVerificationCode} 

,然后在Uri的注册端点中对其进行了编码。 EscapeDataString(使用Uri。UnescapeDataString解码,但这与此处无关)。因此,当我收到电子邮件并单击链接时,在本地击中了端点并可以对其进行调试,但是在部署到Azure(Web应用程序资源组)之后,我得到以下响应:

The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.

当我将代码缩短为不包含任何特殊字符(现在已对其进行编码,例如为%2F %3D 等)时,端点(但是官方令牌无效)。 知道会是什么情况吗?

1 个答案:

答案 0 :(得分:1)

生成的代码是Base64编码的,出于安全原因,即使URL编码,默认情况下,URL的路径段中也不允许Base64中的某些字符。尽管可以更改它,但您不应该这样做,因为安全性考虑是正确的,并且您不想让应用程序受到攻击。

相反,您可以简单地使代码成为查询字符串的一部分。 URL的查询字符串部分不存在相同的漏洞,并且此处将允许使用这些字符。或者,您可以使用其他类型的代码。 Identity可以将用于电子邮件确认和密码重置之类的令牌提供者进行自定义。

Identity包括其他令牌提供者,用于两因素身份验证,您可以根据需要进行切换。它们使用基于TOTP的令牌(使用2FA时常看到的6-7位数字)。或者,您可以创建自己的自定义提供程序并根据需要进行处理。要更改提供商,只需在设置身份时配置Tokens成员:

services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
    // other options here like password reqs, etc.
    o.Tokens.ChangeEmailTokenProvider = TokenOptions.DefaultEmailProvider;
    o.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
    o.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
}

以上所述将导致这三种情况通过内置的基于TOTP的提供程序之一EmailTokenProvider生成令牌。

如果要使用自定义提供程序,只需创建一个实现IUserTwoFactorTokenProvider<TUser>的类并注册该类:

services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
    ...
})
.AddTokenProvider<MyCustomTokenProvider<ApplicationUser>>("MyTokenProviderName");

您用作“名称”的字符串就是您在上面的先前代码中将其分配为令牌提供者的方式,即:

o.Tokens.PasswordResetTokenProvider = "MyTokenProviderName";