激活令牌无效 - 控制器有问题?

Invalid activation token - problem with controller?

我有一个非常奇怪的问题。在以前版本的 .net core 中一切正常,但现在在 .net core 3.1 中却没有。

事情是这样的,在用户注册帐户后,我会向他发送激活电子邮件,其中包含这样创建的激活码:

var activationCode = await userMan.GenerateEmailConfirmationTokenAsync(su);

接下来我生成一个 http url,其格式如下:

http://localhost/api/users/activate?userId=1234&code=abc+860/def==

现在,请注意 userId 是一个有效的 GUID,我的激活码只是示例,因为我确实得到了一个很长的代码。但此代码中重要的是 - 它具有加号 (+)、斜杠并以双等号结尾。

现在我收到一封电子邮件,其中包含有效的用户 GUID 和仍然有效的激活码。但是,当我单击此 link 并且我的 UsersController 启动时,发生了一些不好的事情。这是我在UserController中的激活方法(部分代码)

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    [HttpGet("activate")]
    [AllowAnonymous]
    public async Task<IActionResult> ActivateAccount([FromQuery] Guid userId, [FromQuery] string code)
    {
        if (userId == Guid.Empty || string.IsNullOrWhiteSpace(code))
            return BadRequest();
    }
}

奇怪的是code参数在这里无效。该值只是没有加号。相反,它有空格。怎么了?

您需要URL 对参数进行编码。如果没有它,一些符号可能会被剥离。 您可以阅读更多 here 有关符号和程序的信息。

正确的 URL 你会是:

http://localhost/api/users/activate?userId=1234&code=abc%2B860%2Fdef%3D%3D

要生成正确的 URL,您可以在给某人 URL 之前使用 HttpUtility.UrlEncode。阅读 link,因为其中包含可能有用的详细信息。这是编码 URLs.

的一些常见方法

here 是一篇不错的文章,列出了所有或大多数方法,讨论了如何达到顶峰。