我具有.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 等)时,端点(但是官方令牌无效)。 知道会是什么情况吗?
答案 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";