当前位置:  开发笔记 > 编程语言 > 正文

WCF:将Nonce添加到UsernameToken

如何解决《WCF:将Nonce添加到UsernameToken》经验,为你挑选了4个好方法。

我正在尝试连接到用Java编写的Web服务,但有些东西我无法弄清楚.

使用WCF和customBinding,几乎所有内容似乎都很好,除了SOAP消息的一部分,因为它缺少Nonce和Created部分节点.显然我错过了一些东西,所以如果你能指出我正确的方向,那就非常感激了.

这是自定义绑定:


    
    
    
    

这是消息的相关部分:


    
        
            
        
        
            
        
    

这就是它的外观:


 
    ..
    ..
    6ApOnLn5Aq9KSH46pzzcZA==
    2009-05-13T18:59:23.309Z
 

所以问题是:我如何在安全部分中引入Nonce和Created元素?



1> Bron Davies..:

为了创建现时,我不得不改变一些事情

首先,在我的配置中添加了自定义绑定


    
      
        
          
          
          
          
        
      
    



    

然后,在这里找到这个代码:http: //social.msdn.microsoft.com/Forums/en-US/wcf/thread/4df3354f-0627-42d9-b5fb-6e880b60f8ee 并修改它以创建nonce(只是随机hash,base-64编码)

protected override void WriteTokenCore(System.Xml.XmlWriter writer, System.IdentityModel.Tokens.SecurityToken token)
{
    Random r = new Random();
    string tokennamespace = "o";
    DateTime created = DateTime.Now;
    string createdStr = created.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
    string nonce = Convert.ToBase64String(Encoding.ASCII.GetBytes(SHA1Encrypt(created + r.Next().ToString())));
    System.IdentityModel.Tokens.UserNameSecurityToken unToken = (System.IdentityModel.Tokens.UserNameSecurityToken)token;
    writer.WriteRaw(String.Format(
    "<{0}:UsernameToken u:Id=\"" + token.Id + "\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +
    "<{0}:Username>" + unToken.UserName + "" +
    "<{0}:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">" +
    unToken.Password + "" +
    "<{0}:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">" +
    nonce + "" +
    "" + createdStr + "", tokennamespace));
}

protected String ByteArrayToString(byte[] inputArray)
{
    StringBuilder output = new StringBuilder("");
    for (int i = 0; i < inputArray.Length; i++)
    {
    output.Append(inputArray[i].ToString("X2"));
    }
    return output.ToString();
}
protected String SHA1Encrypt(String phrase)
{
    UTF8Encoding encoder = new UTF8Encoding();
    SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
    byte[] hashedDataBytes = sha1Hasher.ComputeHash(encoder.GetBytes(phrase));
    return ByteArrayToString(hashedDataBytes);
}



2> Rebecca..:

我有同样的问题.我使用a MessageInspector来代替自定义令牌序列化程序UsernameTokenBeforeSendRequest方法中添加正确的.然后我使用自定义行为来应用修复.

在我的博客文章中记录整个过程(带有演示项目)在WCF客户端代理中支持WS-I Basic Profile Password Digest.或者,您只需阅读PDF即可.

如果您想跟进我的进展到解决方案,您将在StackOverflow上找到它,标题为" WCF客户端使用WS-Security UsernameToken PasswordDigest身份验证方案消耗Axis 2 Web服务时出错 ":



3> Ladislav Mrn..:

本文提供了将UserNameToken Profile与消化密码完全集成到WCF安全管道中的示例.



4> Matt Kemp..:

值得指出的是,Rick Strahl做了一篇博客文章(他引用了这个问题),在那里他非常清楚地解释了这一点,并为密码和PasswordDigest提供了解决方案.

我发布这篇文章是因为我最初发现这篇文章,并不能真正遵循它,并且很晚才发现Rick的帖子.这可能会节省一些人的时间.

WCF WSSecurity和WSE Nonce身份验证

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有