使用加号解码字符串



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

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

/使用%2F进行编码。我从使用 Angular 在客户端上调用的 URL 收到了令牌。

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

HttpUtility.UrlDecode(token)

WebUtility.UrlDecode(token)

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

如何解码字符串?

更新

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

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

但是,不知何故,它似乎是以下操作中的令牌:

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

转换为:

Z%2F3+3Q==

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

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

背景

最终,这是ASP.NET MVC框架和现在ASP.NET Core已知限制。在 ASP.NET GitHub网站上有很多关于这个问题的讨论。在#4599(从2016年开始(上,关于这是否是正确的行为进行了长时间的辩论。在 #4445(从 2019 年开始(上,来自 Microsoft 的贡献者承诺提供一个选项来允许解码这些参数。

然而,不幸的是,这并没有进入 ASP.NET Core 3.1 或ASP.NET Core 5.0- 虽然它仍然开放,但它已从PRI:1 - 必需问题降级为严重性次要问题。

解决方法

在Microsoft为此提供解决方案之前,有三个选项可用于解决该行为:

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

更新:贡献者@Celluj34提供了自定义模型绑定程序的示例实现,以解决 GitHub 问题上的此问题。

这些都不是特别令人满意。但这至少证实了你所看到的行为是已知的和预期的,即使它可以说是不正确的。

最新更新