我遇到了配置为使用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编码字符串以验证问题,但不幸的是它没有解决问题。我的想法很糟糕。
答案 0 :(得分:0)
LDAPv3规范(RFC 4510)要求客户端将userPassword值以UTF8编码,然后再将其发送到服务器。 userPassword被服务器视为八位字符串,即它将逐字节匹配。 这就是客户端应用程序必须始终将本地字符集转换为UTF-8的原因。 如果用户密码设置为ASCII字符,不符合LDAPv3规范,则会导致与您发现的标准兼容的客户端和库的互操作性问题。