浏览器将 URL 的路径部分中的编码斜杠 (%2F) 转换为文字斜杠 (/)

Browser converts encoded slash (%2F) to literal slash (/) in path portion of URL

我目前正在使用 ASP.NET Identity.

注册后使用电子邮件确认

此库提供完成注册所需的令牌生成。此令牌在我们的应用程序中用于以下路径:

https://localhost/#/account/{token}/setup

令牌是通过调用生成的:

var emailToken = _userManager.GenerateEmailConfirmationToken(newUser.Id);

生成令牌后,我通过 string.Format 将其添加到路径中:

string.Format("https://localhost/#/account/{0}/setup", HttpUtility.UrlEncode(emailToken));

结果如下所示:

https://localhost/#/account/AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQhGTTMUWVHDgOwC9T9AAAAAACAAAAAAAQZgAAAAEAACAAAAAqo%2fiAv8iIn7Zox9pS3MOUMVNisAo7Bnada6%2f9wKEe6wAAAAAOgAAAAAIAACAAAABUu7WkD9vHvN2EDz2%2bqGwvJ4j6gj%2f4PaBTbI861jfEcWAAAADJV74LZjKAXv5v1FqYVuWLyTpPBCnLfopSi3rsEEwMHFKwltHL3moL2h%2fvYVs%2fu3LB%2br5Qytuu%2fZYOUWQTY5KzBqHeZoi7RJ02emDI0NTRhIKxfSGGIdbYxuAjsW14G0BAAAAACsC8L%2bdUDzFMgKUOkxWhKofAz8L0mH5VFEt8Oq%2fKYsxIiu4fiA2sGlPfDhhKQnV2lg%2ba8qHydUjqmyfxNex0Pg%3d%3d/setup

但是当我在浏览器中打开这个 url 时,我得到:

...等等!

我看到的是 url 在电子邮件正文中正确编码,但是当我在浏览器中打开它时通过替换编码的 "%2f" 进行了解码。 =44=] 到 "/"。这导致我的应用程序中出现无效路由,因为我希望“/”成为不同资源之间的分隔符。

对这种行为有什么想法吗?

参考文献:

Another guy with my problem too

它可能正在解码它,因为它认为它是路径的一部分。

我建议您明确地将其视为参数。这将告诉浏览器不要解码它。例如,而不是这条路径:

https://localhost/#/account/AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh........

使用此路径:

https://localhost/#/account/?t=AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh......

请注意在帐户路径结束后添加 ?t=

然后在您的应用程序中使用 t 参数。这将告诉浏览器末尾的值不会被解码为路径的一部分,而是以编码形式保留,因为它是一个参数。

这显然会改变你的路径(因为设置部分)所以相应地调整。