c# - 以编程方式添加端点 header 安全性 WCF

标签 c# wcf wcf-security webservice-client

我有这个 web.config 文件来配置来自外部服务的客户端代理这个服务需要在消息头上进行身份验证,我已经在我的 web.config 上很好地配置了服务但是现在我尝试创建代理在代码上使用此配置,建议动态更改用户和密码。

<cliente>
    <endpoint address="https://wwwww.hhhahdhadhs.askadadasda" binding="basicHttpBinding" bindingConfiguration="MyConfiguration" contract="PROXY_ACSS_SERVICES.RegistoPrescricaoMedicamentos">
            <headers>
              <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                <wsse:UsernameToken>
                  <wsse:Username>MyUser</wsse:Username>
                  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">87726655434</wsse:Password>
                </wsse:UsernameToken>
              </wsse:Security>
            </headers>
          </endpoint>
</cliente>

<basicHttpBinding>
<binding name="PrescricaoMedicamentos" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="Certificate" algorithmSuite="Default" />
          </security>
        </binding>
</basicHttpBinding>

我的问题是创建定义用户名和密码的 header ,

<headers>


   <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
              <wsse:Username>MyUser</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">87726655434</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>  

提前致谢

编辑

Ladislav Mrnka 在我以编程方式创建代理后收到此消息

'The request channel timed out attempting to send after 00:00:59.9829990. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.'

这是我的代理配置

   BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
            binding.Name = "PrescricaoMedicamentos";
            binding.CloseTimeout = new TimeSpan(0, 1, 0);
            binding.OpenTimeout = new TimeSpan(0, 1, 0);
            binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
            binding.SendTimeout = new TimeSpan(0, 1, 0);
            binding.AllowCookies = false;
            binding.BypassProxyOnLocal = false;
            binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
            binding.MaxBufferSize = 65536;
            binding.MaxBufferPoolSize = 524288;
            binding.MaxReceivedMessageSize = 65536;
            binding.MessageEncoding = WSMessageEncoding.Text;
            binding.TextEncoding = System.Text.Encoding.UTF8;
            binding.TransferMode = TransferMode.Buffered;
            binding.UseDefaultWebProxy = true;
            binding.ReaderQuotas = new XmlDictionaryReaderQuotas()
                                       {
                                           MaxDepth = 32,
                                           MaxStringContentLength = 8192,
                                           MaxArrayLength = 16384,
                                           MaxBytesPerRead = 4096,
                                           MaxNameTableCharCount = 16384
                                       };

            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; 


            return binding;

我想知道是否可以在代码中为所有消息添加静态 header 。类似于 AddressHeader.CreateAddressHeader( 'authentication header') 并将此 header 应用于我的 EndpointAddress 配置。这种方法直接替代了我的第一段代码

<headers>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
              <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">mypass</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>

最佳答案

如果服务正确实现了用户名 token 配置文件,请将绑定(bind)中的安全设置更改为:

<security mode="TransportWithMessageCredential">
    <message clientCredentialType="UserName" />
</security>

一旦您通过以下方式创建代理集凭据:

proxy.ClientCredentials.UserName.UserName = ...;
proxy.ClientCredentials.UserName.Password = ...;

关于c# - 以编程方式添加端点 header 安全性 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7527288/

相关文章:

c# - 在 .NET 中,如何向需要身份验证的 Web 服务提供 session 标识符?

c# - 具有接口(interface)和通用模​​型的 WCF

wcf - 使用 WCF : no CertificateRequest and CertificateVerify in handshake phase 的相互 SSL 身份验证

.net - 将wsHttpBinding SSL传输安全性与消息安全性结合使用有什么好处?

c# - 如何在没有延迟的情况下在 Windows 中重新定位图形?

c# - 在 C# 中 ZedGraph 中的图形数据上光标时显示 x、y 和曲线名称

c# - MEF 从目录加载插件

wcf - 本地构建 v TFSBuild 问题...有什么想法吗?

silverlight - 为 silverlight 应用程序使用 wsHttpBinding 或 basicHttpBinding,哪一个?

ssl - 为什么在作为 Windows 服务托管的休息服务上添加基于证书的身份验证,无法启动服务?