解码带加号的字符串

Decode string with plus sign

使用 ASP.NET 核心我收到以下令牌(简化):

String token = "Z%2F3+3Q==";

/ 使用 %2F 编码。我从客户端使用 Angular.

调用的 URL 收到令牌

我尝试使用以下方法解码令牌:

HttpUtility.UrlDecode(token)

WebUtility.UrlDecode(token)

在这两种情况下,%2F 都被我想要的 / 替换了,但是 + 被我不想要的 space 替换了。

如何解码字符串?

更新

客户端应用程序正在发送编码的令牌:

Z%2F3%2B3Q%3D%3D;

但是,不知何故,似乎是以下操作中的标记:

[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}

转化为:

Z%2F3+3Q==

所以 += 被解码了,但是 / 没有被解码。

这里的关键是这是作为 路由参数 传递的,未正确解码的特定字符是 /。正如您想象的那样,在处理路由参数中的 / 时存在一些潜在问题,因为它们通常被视为路由分隔符。

背景

最终,这是 ASP.NET MVC 框架 和现在 [ 的已知限制 =57=]核心ASP.NET GitHub site. On #4599 (from 2016), there's a lengthy debate about whether or not this is the correct behavior. On #4445 (from 2019), a contributor from Microsoft committed to providing an option to allow decoding of these parameters.

上对此有不少讨论

不幸的是,这并没有进入 ASP.NET Core 3.1ASP.NET Core 5.0—虽然它仍然开放,但它已从 PRI: 1 - Required 问题降级为 severity-minor 问题。

解决方法

在 Microsoft 提供解决方案之前,可以通过三个选项解决此问题:

  1. 通过查询字符串传递 {token} 参数,它将被完全解码。
  2. 将代码添加到您的应用程序中,在 %2F 绑定发生后显式解码。
  3. 创建您自己的 IModelBinder 以修改模型绑定行为本身。

Update: Contributor @Celluj34 has provided a sample implementation of a custom model binder to solve this on the GitHub issue.

None 其中特别令人满意。但这至少证实了您所看到的行为是已知的和预期的,即使它可能是不正确的。