c# - WS-Security C# 到 PHP
问题描述
我有这个 C# 代码,它生成一个二进制 base 64 用户名令牌以连接到 wsdl。
var client = new StandardApiClient();
var credentials = client.ClientCredentials.UserName;
credentials.UserName = "myusername";
credentials.Password = "mypassword";
这将创建以下 xml
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-29" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>myusername</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypassword</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">bLW62fQBaMG77CELiw11dg==</wsse:Nonce>
<wsu:Created>2016-01-22T18:14:02.430Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
我在网上试过几个例子,但都是无效的。这是我目前拥有的。
protected function getHeaderXml()
{
$dateCreated = date('Y/m/d H:i:s');
$nonce = base64_encode(sha1((mt_rand() . $dateCreated . self::PASSWORD)));
return '
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://cdx.XXXXX.com/Api/0.99/" xmlns:deal="http://schemas.datacontract.org/2004/07/XXX.BaseApi" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-29" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>'.self::USERNAME.'</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'.urlencode(self::PASSWORD).'</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">'.$nonce.'</wsse:Nonce>
<wsu:Created>'.$dateCreated.'</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>';
}
解决方案
推荐阅读
- c# - 试图减去 DateTime “System.FormatException: String '12/9/2019 12:00:00 AM' 未被识别为有效的 DateTime。”
- matlab - Matlab中的转置复杂度Big O是多少?
- java - 如何修复列表视图中的搜索栏功能?
- react-native - useSelector into function throws error hooks 只能在函数组件的主体内部调用
- machine-learning - 如何在数据中标记客户
- linux - 如何从文本文件中提取值并使用 Bash 重新排列它们?
- node.js - Node.js SQLite 不返回任何内容
- javascript - 如何将 props 传递给 React Router 路由
- ios - SwiftUI @State 与绑定
- powershell - 在 Azure devops 管道中运行 Azure powershell 命令