Как отключить безопасность в wcf для customBinding - PullRequest
0 голосов
/ 28 июля 2011

У меня есть служба, которая ранее была настроена для использования привязки nettcp.Эта конфигурация работала.

Ее привязка выглядела так:

<binding name="TcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
          receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"   
          transferMode="Streamed" transactionProtocol="OleTransactions"   
          hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
            maxBufferPoolSize="524288"      
          maxConnections="10" maxReceivedMessageSize="100000000">
  <readerQuotas maxNameTableCharCount="1000000" maxStringContentLength="8192000" 
          maxArrayLength="1638400" />
  <security mode="None"/>
    </binding>

Я попытался перевести это в customBinding, чтобы включить leaseTimeout.

<customBinding>
   <binding name="TcpBindingCustom" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" >
      <windowsStreamSecurity protectionLevel="None" />
      <transactionFlow transactionProtocol="OleTransactions"/>
      <tcpTransport transferMode="Streamed" hostNameComparisonMode="StrongWildcard"        
               maxBufferPoolSize="524288" listenBacklog="10" 
               maxReceivedMessageSize="100000000"  portSharingEnabled="true"
               maxBufferSize="65536">
        <connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
            idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
      </tcpTransport>
    </binding>
<customBinding>

Я не сделалПосмотрите способ дублирования <security mode ="None">

Это работает нормально, когда все локально, но я получаю следующее исключение после его развертывания.

System.ServiceModel.Security.SecurityNegotiationException: 
The server has rejected the client credentials. --->    
System.Security.Authentication.InvalidCredentialException: 
The server has rejected the client credentials. ---> 
System.ComponentModel.Win32Exception: 

Я не получил эти ошибки сtcpBinding.

Как мне продублировать это поведение с помощью customBinding?Может ли что-то другое вызывать исключение SecurityNegotiationException?

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Я думаю, вам нужно использовать элемент customBinding для настройки вашей службы. Я не видел этого в конфиге, который вы указали. Посмотрите эту хорошую статью MSDN о настройке привязок, чтобы узнать, как создать настраиваемую привязку. Пользовательские привязки указаны в конце статьи.

EDIT: Извините, блоки конфига перевернуты. NetTcpBinding в WCF - это безопасное связывание , которое по умолчанию использует идентификацию Windows и безопасность транспорта. Несмотря на то, что вы пытаетесь создать пользовательскую версию с режимом безопасности «none», вам на самом деле нужно соответствовать настройке netTcpBinding. Было бы неплохо, если бы MSDN документировал все стандартные привязки, показывая, как они на самом деле выглядят как пользовательские привязки. Попробуйте этот конфиг:

<customBinding>
    <binding name="TcpBindingCustom" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" >
        <windowsStreamSecurity protectionLevel="None" />
        <transactionFlow transactionProtocol="OleTransactions"/>
        <tcpTransport transferMode="Streamed" hostNameComparisonMode="StrongWildcard"        
           maxBufferPoolSize="524288" listenBacklog="10" 
           maxReceivedMessageSize="100000000"  portSharingEnabled="true"
           maxBufferSize="65536">
           <connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
               idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
        </tcpTransport>
        <security authenticationMode="AnonymousForSslNegotiated"/>
    </binding>
<customBinding>
0 голосов
/ 29 июля 2011

Оказалось, что ответом было удаление всей информации о безопасности из тега привязки. Так что в этом случае удалите

<windowsStreamSecurity protectionLevel="None" />

и

<security authenticationMode="AnonymousForSslNegotiated"/>

Я последовал совету Сиксто Саеза и посмотрел на реализацию NetTcpBinding в Reflector.

Класс NetTcpBinding переопределяет метод CreateBindingElements для включения этой логики:

SecurityBindingElement item = this.CreateMessageSecurity();
if (item != null)
{
    elements.Add(item);
}

с CreateMessageSecurity, реализованным так:

private SecurityBindingElement CreateMessageSecurity()
{
   if ((this.security.Mode != SecurityMode.Message) 
            && (this.security.Mode != SecurityMode.TransportWithMessageCredential))
   {
      return null;
   }
   return this.security.CreateMessageSecurity(this.ReliableSession.Enabled);
}

Один из моих коллег смог выполнить эту логику в отладчике и воспроизвести это поведение с помощью пользовательской привязки.

На самом деле было бы очень полезно, если бы кто-то мог создать таблицу преобразования, показывающую, как создаются основные привязки с помощью пользовательских элементов привязки.

...