用加号解码字符串

Mig*_*ura 6 c# urlencode asp.net-routing asp.net-core asp.net-core-3.1

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

String token = "Z%2F3+3Q==";
Run Code Online (Sandbox Code Playgroud)

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

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

HttpUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)

或者

WebUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)

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

我如何解码字符串?

更新

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

Z%2F3%2B3Q%3D%3D;
Run Code Online (Sandbox Code Playgroud)

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

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

转化为:

Z%2F3+3Q==
Run Code Online (Sandbox Code Playgroud)

所以+=被解码,但/不是。

Jer*_*ney 7

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

背景

归根结底,这是一个已知的限制有两个ASP.NET MVC框架,现在ASP.NET核心。在ASP.NET GitHub 站点上有很多关于此的讨论。在#4599(从 2016 年开始)上,关于这是否是正确的行为存在长时间的争论。在#4445(自 2019 年)上,来自 Microsoft 的贡献者承诺提供一个选项以允许解码这些参数

然而,不幸的是,这并没有使其成为ASP.NET Core 3.1ASP.NET Core 5.0 - 虽然它保持开放状态,但它已从PRI: 1 - 必需问题降级为严重性次要问题。

解决方法

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

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

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