使用 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为此提供解决方案之前,有三个选项可用于解决该行为:
- 改为通过查询字符串传递
{token}
参数,它将在其中完全解码。 - 向应用程序添加代码,以便在发生绑定后显式解码
%2F
。 - 创建自己的
IModelBinder
来修改模型绑定行为本身。
更新:贡献者@Celluj34提供了自定义模型绑定程序的示例实现,以解决 GitHub 问题上的此问题。
这些都不是特别令人满意。但这至少证实了你所看到的行为是已知的和预期的,即使它可以说是不正确的。