8

我正在尝试将 WSSE SOAP 标头添加到我的服务调用中,但大多数示例都集中在 WCF 上。我没有使用 WCF。我添加了一个 Web 参考 (WSDL)。

我尝试了各种方法都没有成功,比如 - 覆盖 GetWebRequest 方法:

    protected override System.Net.WebRequest GetWebRequest(Uri uri)
    {
        string user = "username";
        string pwd = "password";

        System.Net.WebRequest request = base.GetWebRequest(uri);

        string auth = string.Format("Basic {0}", Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(string.Format("{0}:{1}", user, pwd))));
        request.PreAuthenticate = true;
        request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
        request.Headers.Add(HttpRequestHeader.Authorization, auth);

        return request;
    }

WSSE 安全标头应类似于以下内容:

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <UsernameToken>
            <Username>username</Username>
            <Password>password</Password>
         </UsernameToken>
      </Security>

提前谢谢了!亲切的问候,

4

2 回答 2

0

尝试添加评论,但它太长了......

第二个链接还可以吗?无论如何,这里不是链接,而是我认为的关键信息(以防链接消失) - 将 System.Web.Services.Protocols.SoapHttpClientProtocol 的引用替换为 Microsoft.Web.Services2.WebServicesClientProtocol (或 Microsoft.Web. Services3.WebServicesClientProtocol,如果这对你有用 - 我通过 nuget 找到了 services2)。我们需要更改类,因为 SoapHttpClientProtocol 中的请求方法是受保护的,因此很难(不可能?)调整任何请求细节。如果您使用 WCF 生成代码,我假设更改类会为您提供所有可能性。如果您要添加用户名,那么您可能需要添加所有其他 SOAP 安全值,因此正确的方式为 SOAP webservice 传达 WSSE Usernametoken是一个方便的参考。

于 2021-04-29T03:22:39.773 回答