在阅读有关基本身份验证的内容时,我总能找到与此类似的示例:
HttpClient sClient new HttpClient();
sClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic",Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("UserName:Password")));
对我来说,这似乎意味着冒号字符“:”不应该用在密码中。这是否意味着密码和用户名应禁止冒号?
这是基本身份验证的一般假设吗?如果您的凭据中存在包含现有冒号字符的现有用户库,如何处理此问题。
答案 0 :(得分:3)
从技术上讲,用户名中禁止使用:
:https://www.ietf.org/rfc/rfc2617.txt
To receive authorization, the client sends the userid and password,
separated by a single colon (":") character, within a base64 [7]
encoded string in the credentials.
basic-credentials = base64-user-pass
base64-user-pass = <base64 [4] encoding of user-pass,
except not limited to 76 char/line>
user-pass = userid ":" password
userid = *<TEXT excluding ":">
password = *TEXT
值得注意的是:RFC2617没有说明如果用户名包含冒号该怎么办。 IE和Firefox都只是简单地包含它,可能是最糟糕的选择。
如果您的用户名包含:
,则应该将其 - %3a
% - 以将其与分隔符区分开来。服务器是否支持这取决于服务器。
说了这么多,HTTP Basic是一个非常糟糕的身份验证方案;使用更好地保护客户端凭据的东西是更好的选择。