c# - 在 C# 中处理编码的 cookie 值

标签 c# cookies cross-platform single-sign-on

根据 RFC 2109 ,cookie 的值“对用户代理是不透明的,可以是源服务器选择发送的任何内容,可能采用服务器选择的可打印 ASCII 编码。”

因此,即使原始值相同,不同的语言/平台/服务器也会发送不同的 cookie 值。

例如,C#/ASP.NET 按原样发送文本;经典的 ASP urlencodes 和 urldecodes 文本; Perl/Apache urlencodes/decods 文本(但不同于 ASP!)。 Php 为您提供了选择。

我正在编写一个需要与截然不同的应用程序共享 cookie 的单点登录系统。特别是我有 .NET、Java、Perl、ColdFusion 需要开箱即用的支持。

我存储在 cookie 中的文本始终是有效的 ASCII-7字符串。然而,例如,Perl 喜欢对一些 7 位 ASCII 字符进行编码。

我看到两个主要的替代方案来完成这项工作:

  1. 只接受非编码值。毕竟没有必要对它们进行编码。目前就是这样。显然,所有集成系统都必须能够支持非编码值。

  2. 接受编码和非编码值。这将允许开箱即用的最大兼容性,但我需要确定是否对特定值进行了编码(这听起来很不可能:“%20”是文字“%20”字符串还是空格?)

您会建议哪种解决方案,为什么?如果是 #2,您将如何检测 UrlEncoded 文本?


cookie 示例(我添加了换行符以使其适合)

A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832|
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC
8A3CA18252D376473C244FD71C462AB42CF54C

最佳答案

是的,这不是一个小问题。从根本上说,我更倾向于解决方案 #2,因为它是最具互操作性的。但是,正如您所说,检测哪些 cookie 是 URL 编码的,哪些不是,这是一个非常重要的问题。

我想到的一件事是,您可以使用一些特殊字符来填充 Cookie 值的开头,这样您就可以检测 Cookie 是否经过编码。当然,这可能无法涵盖所有​​客户端,但例如,如果您的正常 cookie 值的格式为 CookieValue1234,那么您可以将其更改为 head :CookieValue1234 并检查那里的空格是否会返回 URL 编码(即返回为“%20”或“”)。

关于c# - 在 C# 中处理编码的 cookie 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1311986/

相关文章:

c# - Linq lambda 表达式多对多表选择

javascript - 重定向到 ASP MVC 中的另一个页面后,如何使 Toastr Notification 保持事件状态

php - 无法登录 TeSTLink - 未保存 session /cookie

JavaScript cookie 错误

cross-platform - MSYS2 上的 Perl6 脚本导致 'failed to stat file' 错误

c++ - 立即退出 C++ 应用程序?

c# - 如何转义 JSON 字符串?

ruby-on-rails - Rails4 安全 : Session fixation possible at all using encrypted cookies?

python - 带有 python 脚本的游戏引擎?

c# - IRequiresSessionState 与 IReadOnlySessionState