应用 url 中的电子邮件验证码(部署在 Azure 上)找不到端点
Email verification code in app url (deployed on azure) not finding endpoint
我有这样的 .net 核心身份电子邮件验证端点设置:
/api/[controller]/{userId}/{emailVerificationCode}
我用 Uri 将它编码在注册端点中。 EscapeDataString(使用 Uri.UnescapeDataString 解码,但这与此处无关)。因此,当我收到电子邮件并单击 link 时,我在本地点击了端点并可以对其进行调试,但是在部署到 azure(Web 应用程序资源组)之后,我得到了以下响应:
The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.
当我缩短代码以使其不包含任何特殊字符时(现在已对其进行编码,例如 %2F、%3D等)端点被命中(但 ofc 令牌无效)。
知道会发生什么情况吗?
生成的代码是 Base64 编码的,并且出于安全原因,默认情况下不允许在 URL 的路径段中使用 Base64 中的某些字符,即使在 URL 编码时也是如此。虽然可以更改它,但您不应该更改,因为安全问题是有效的,并且您不想让您的应用程序受到攻击。
相反,您可以简单地让代码成为查询字符串的一部分。 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;
}
以上将导致这三种情况通过 EmailTokenProvider
生成令牌,这是内置的基于 TOTP 的提供程序之一。
如果您想使用自定义提供程序,只需创建一个实现 IUserTwoFactorTokenProvider<TUser>
的 class 并注册:
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
...
})
.AddTokenProvider<MyCustomTokenProvider<ApplicationUser>>("MyTokenProviderName");
您用作 "name" 的字符串是您在上面的代码中用于将其分配为令牌提供者的字符串,即:
o.Tokens.PasswordResetTokenProvider = "MyTokenProviderName";
我有这样的 .net 核心身份电子邮件验证端点设置:
/api/[controller]/{userId}/{emailVerificationCode}
我用 Uri 将它编码在注册端点中。 EscapeDataString(使用 Uri.UnescapeDataString 解码,但这与此处无关)。因此,当我收到电子邮件并单击 link 时,我在本地点击了端点并可以对其进行调试,但是在部署到 azure(Web 应用程序资源组)之后,我得到了以下响应:
The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.
当我缩短代码以使其不包含任何特殊字符时(现在已对其进行编码,例如 %2F、%3D等)端点被命中(但 ofc 令牌无效)。 知道会发生什么情况吗?
生成的代码是 Base64 编码的,并且出于安全原因,默认情况下不允许在 URL 的路径段中使用 Base64 中的某些字符,即使在 URL 编码时也是如此。虽然可以更改它,但您不应该更改,因为安全问题是有效的,并且您不想让您的应用程序受到攻击。
相反,您可以简单地让代码成为查询字符串的一部分。 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;
}
以上将导致这三种情况通过 EmailTokenProvider
生成令牌,这是内置的基于 TOTP 的提供程序之一。
如果您想使用自定义提供程序,只需创建一个实现 IUserTwoFactorTokenProvider<TUser>
的 class 并注册:
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
...
})
.AddTokenProvider<MyCustomTokenProvider<ApplicationUser>>("MyTokenProviderName");
您用作 "name" 的字符串是您在上面的代码中用于将其分配为令牌提供者的字符串,即:
o.Tokens.PasswordResetTokenProvider = "MyTokenProviderName";