如何处理HTTP请求标头中的非ASCII字符?

时间:2019-10-30 14:06:14

标签: http .net-core

在我们的应用程序中,我们将密码作为标头的一部分发送到我们的auth服务。但是,我们遇到了这样一种情况,用户正在使用非ASCII字符作为其密码的一部分,我发现HTTP不支持非ASCII字符。

有什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要以ASCII兼容格式对其进行编码。

Base 64是这样的编码。

这是他们使用HTTP Basic Authentication使用Base 64编码的示例。

  

授权字段的构造如下:

     
      
  • 用户名和密码用单个冒号(:)组合。这意味着用户名本身不能包含冒号。
  •   
  • 结果字符串被编码为一个八位字节序列。只要与US-ASCII兼容,默认情况下未指定用于此编码的字符集,但是服务器可以通过发送charset参数来建议使用UTF-8。
  •   
  • 结果字符串使用Base64的变体进行编码。
  •   
  • 然后将授权方法和空格(例如“ Basic”)添加到编码字符串中。
  •   
     

例如,如果浏览器使用Aladdin作为用户名,使用OpenSesame作为密码,则该字段的值为Aladdin:OpenSesameQWxhZGRpbjpPcGVuU2VzYW1l的base64编码。 。然后,授权标头将显示为:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l 

因此,假设您的密码为ǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟ,则无法使用ASCII字符集来表示。

这里有一些伪代码向您展示如何实现

var password = 'ǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟ'
var base64EncodedPassword = base64Encode(password)

var httpHeader = new HttpHeader('Password', base64EncodedPassword)

这将导致以下标题。仅使用ASCII字符表示

Password: x4HHgseDx4THhceGx4fHiMeJx4rHi8eMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5zHnceex58=