0

我有这样的 .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等)时,端点被命中(但 ofc 令牌无效)。知道可能是什么情况吗?

4

1 回答 1

1

生成的代码是 Base64 编码的,出于安全原因,默认情况下不允许在 URL 的路径段中使用 Base64 中的某些字符,即使是 URL 编码也是如此。虽然可以更改它,但您不应该这样做,因为安全问题是有效的,并且您不希望将您的应用程序暴露给漏洞利用。

相反,您可以简单地让代码成为查询字符串的一部分。URL 的查询字符串部分不存在相同的漏洞,并且这些字符将被允许存在。或者,您可以使用不同类型的代码。可以自定义 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>并注册的类:

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

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

o.Tokens.PasswordResetTokenProvider = "MyTokenProviderName";
于 2018-08-29T12:34:02.590 回答