React,querystring.stringify使用错误的编码,Spring身份验证失败。如何更改编码

时间:2016-11-03 08:50:56

标签: spring authentication reactjs encoding ldap

我遇到了配置为使用LDAP进行身份验证的Spring安全性问题。如果用户名或密码包含斯堪的纳维亚字母(ä,ö,å...),则身份验证失败。我使用相同的LDAP使用不同的应用程序验证了登录成功与相同的凭据,因此问题确实是编码。请注意,每个应用程序使用不同的身份验证服务,只有LDAP与每个服务相同。

使用登录成功的应用程序,使用用户名Asdf123和密码Äöasdf123#%&会导致以下POST有效负载发送到应用程序身份验证端点

username=Asdf123&password=%C4%F6asdf123%23%25%26

现在,使用相同凭据登录失败的应用程序,POST有效内容如下所示

username=Asdf123&password=%C3%84%C3%B6asdf123%23%25%26

在这里我们可以看到使用的编码是不同的。我如何知道工作登录使用哪种编码,我应该更改前端或后端的编码以使应用程序失败,以及如何更改编码以匹配工作应用程序?

修改

我验证了工作登录使用 ascii 编码,失败登录使用 UTF-8 。现在我需要弄清楚如何更改querystring.stringify以使用 ascii 编码。文档说明

  

默认情况下,查询字符串中需要百分比编码的字符将编码为UTF-8。如果需要替代编码,则需要指定替代encodeURIComponent选项

但是,它没有提到可用的encodeURIComponents。所以基本上我需要一个函数,它对url组件执行ascii编码。我发现javascript提供了开箱即用的encodeURIComponent()功能,但它又是 UTF-8 编码器。我在哪里可以找到,或者如何为querystring.stringify创建 ascii 编码器?

修改2

我尝试将登录有效负载硬编码为ascii url编码字符串以验证问题,但不幸的是它没有解决问题。我的想法很糟糕。

1 个答案:

答案 0 :(得分:0)

LDAPv3规范(RFC 4510)要求客户端将userPassword值以UTF8编码,然后再将其发送到服务器。 userPassword被服务器视为八位字符串,即它将逐字节匹配。 这就是客户端应用程序必须始终将本地字符集转换为UTF-8的原因。 如果用户密码设置为ASCII字符,不符合LDAPv3规范,则会导致与您发现的标准兼容的客户端和库的互操作性问题。