将授权标头添加到 WCF 基架 SOAP Web 服务

Posted

技术标签:

【中文标题】将授权标头添加到 WCF 基架 SOAP Web 服务【英文标题】:Adding an Authorization header to a WCF scaffolded SOAP web service 【发布时间】:2020-12-06 05:55:48 【问题描述】:

免责声明我从未使用过 SOAP Web 服务。完全没有。一点儿都没有。所以通道和WCF脚手架的概念让我有点困惑,所以我在这里。

我被要求集成到使用基本身份验证的 SOAP XML Web 服务。 (例如,授权标头,基本 xxxxxxxxxxxxxxxxxxxxxxxxxxxx

我使用 Visual Studio WCF 连接的服务发现来生成脚手架代码,这对我实例化所需的对象等非常有用,但是我的问题是我被要求使用基本身份验证,我不知道在哪里将此代码注入已生成的脚手架中。我以前使用过基本身份验证,所以我了解“如何”做它,例如 REST API 等。只需用户名:密码,base64 编码并添加到授权标头。但是,我不确定如何为这个脚手架的 SOAP Web 服务执行此操作。

我认为可以注入到每个请求中以添加您的自定义标头的代码是:

        using (OperationContextScope scope = new OperationContextScope(IContextChannel or OperationContext)
        
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = new HttpRequestMessageProperty()
            
                Headers =
                
                     "MyCustomHeader", Environment.UserName ,
                     HttpRequestHeader.UserAgent, "My Custom Agent"
                
            ;
        // perform proxy operations... 
    

OperationContextScope 需要 IContextChannel 或 OperationContext。我不知道要在这里添加什么。如果我查看我的脚手架代码,我可以在这里找到 Web 服务的“客户端”:

public partial class POSUserInformationManagerV1_2Client : System.ServiceModel.ClientBase<McaEndpointPosUserInformation.POSUserInformationManagerV1_2>, McaEndpointPosUserInformation.POSUserInformationManagerV1_2

我可以在这里找到“通道”,但它只是另一个接口,没有指定任何合同?

[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.2")]
public interface POSUserInformationManagerV1_2Channel : McaEndpointPosUserInformation.POSUserInformationManagerV1_2, System.ServiceModel.IClientChannel


我查看了 ChannelBase,它似乎应该接受实现一个或另一个通道接口的各种对象(包括 IClientChannel,脚手架 POSUserInformationManagerV1_2Channel 使用)

    protected class ChannelBase<T> : IDisposable, IChannel, ICommunicationObject, IOutputChannel, IRequestChannel, IClientChannel, IContextChannel, IExtensibleObject<IContextChannel> where T : class
    
        protected ChannelBase(ClientBase<T> client);

        [SecuritySafeCritical]
        protected IAsyncResult BeginInvoke(string methodName, object[] args, AsyncCallback callback, object state);
        [SecuritySafeCritical]
        protected object EndInvoke(string methodName, object[] args, IAsyncResult result);

但我仍然坚持我可以放入 OperationContextScope 以将其适当地连接到“通道”。我已经尝试过 POSUserInformationManagerV1_2Client 和相关的 Channel 接口,但都不会转换为 IContextChannel。有没有人有任何想法/想法?

编辑:这是我尝试注入代码以添加 Auth HTTP 标头的地方:

    public System.Threading.Tasks.Task<McaEndpointPosUserInformation.requestUserInformationResponse> requestUserInformationAsync(McaEndpointPosUserInformation.requestUserInformation request)
    
        using (OperationContextScope scope = new OperationContextScope(request)
        
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = new HttpRequestMessageProperty()
            
                Headers =
                
                     "MyCustomHeader", Environment.UserName ,
                     HttpRequestHeader.UserAgent, "My Custom Agent"
                
            ;
        // perform proxy operations... 
    
        return base.Channel.requestUserInformationAsync(request);
    

【问题讨论】:

您有一条带有标头和 xml 正文的 HTTP 消息。因此,您正在做两件事 1) 添加带有凭据(用户名/正文)和 UserAgent(可接受的浏览器)的自定义标头。请参阅:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent 2)您正在将类序列化为 xml,这是正文的上下文。 谢谢jdweng(我觉得你以前回答过我的问题?:P)..但我不确定你提供的信息如何(虽然我确信它很有用) 解决所问问题的具体情况。能稍微详细点吗? 最好的方法是为 header 和 body 创建 c# 类。然后将肥皂的上下文作为类。查看带有标题和正文的 xml 肥皂示例:w3schools.com/xml/xml_soap.asp 【参考方案1】:

问题原来是没有通过使用以下方法将传输安全设置为“基本”:

                // Set the binding. Without this, the WCF call will be made as anonymous
                var binding = new BasicHttpsBinding();
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

【讨论】:

以上是关于将授权标头添加到 WCF 基架 SOAP Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

从.NET调用WCF服务时如何以编程方式添加soap标头?

HTTP 标头或 SOAP 标头中的 WCF 肥皂操作?

如何在 wcf 中添加自定义肥皂标题?

在现有 WCF SOAP 服务中添加 Http 标头不起作用

将 HTTPS 绑定添加到 IIS 后,具有 Windows 身份验证的 WCF SOAP Web 服务停止工作

如何将 HTTP 标头添加到 SOAP 客户端