0

当给定密码为纯文本时,我能够实现方法 AuthenticateToken 并验证用户。

当给定密码被散列(Passworddigest)时,是否可以对用户进行身份验证?如果是这样,请说明一下。提前致谢。

4

1 回答 1

0

我找到了解决方案。是的,当 SOAP 标头中的密码是 PasswordDigest 时,可以对用户进行身份验证。

AuthenticateToken 实现没有变化;纯文本和散列密码的实现是相同的(返回原始密码字符串)。

在调试过程中,我了解到“Microsoft.Web.Services3.Security.Tokens.UsernameToken”对象的“ComputePasswordDigest(byte[] nonce, DateTime created, string secret)”方法中的以下行导致问题无法计算正确的密码摘要。

byte[] bytes = Encoding.UTF8.GetBytes(XmlConvert.ToString(created.ToUniversalTime(), "yyyy-MM-ddTHH:mm:ssZ"));

我在本地定义了相同的方法,并将上面的行更改如下以将格式更改为包含毫秒"yyyy-MM-ddTHH:mm:ss.fffZ"

并从对象“Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager”中实现“VerifyHashedPassword(UsernameToken token, string authenticatedPassword)”方法来调用我的本地方法,而不是“ComputePasswordDigest(byte[] nonce, DateTime created, string secret )”来自“Microsoft.Web.Services3.Security.Tokens.UsernameToken”对象的方法。现在,它就像一个魅力。

byte[] bytes = Encoding.UTF8.GetBytes(XmlConvert.ToString(created.ToUniversalTime(), "yyyy-MM-ddTHH:mm:ss.fffZ"));
于 2015-02-05T01:14:16.730 回答