какие режимы безопасности разрешены для WCF MTOM basicHttpBinding - PullRequest
0 голосов
/ 11 февраля 2020

Я создал новый сервис wcf с MTOM кодировкой сообщений в basicHttpBinding. Теперь у меня есть вопрос с security, какие режимы безопасности будут разрешены для WCF service -MTOM - basicHttpBinding

<basicHttpBinding>
    <binding name="DefaultBinding_Mtom" messageEncoding="Mtom" transferMode="Streamed" maxReceivedMessageSize="700000">
     <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
     <security mode="None">
       <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
       <message clientCredentialType="UserName" algorithmSuite="Default" />
     </security>          
   </binding>
</basicHttpBinding>

В коде выше <security mode="None">, с этим моим Сервис работает как положено в клиенте. Но когда я изменил режим безопасности NTLM <security mode="TransportCredentialOnly">, то при вызове службы у меня возникают проблемы.

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Ntlm" proxyCredentialType="Windows" realm=""/>
  <message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>

, если мой сервис messageEncoding="Text", то работает нормально, даже режим безопасности NTLM. Итак, какой режим безопасности разрешен для службы Mtom, и не могли бы вы рассказать мне, как установить режимы безопасности.

Спасибо и С уважением,

1 Ответ

1 голос
/ 12 февраля 2020

Ни кодировка текста, ни кодировка MTOM не влияют на вызов удаленной службы. Следующие два режима безопасности могут использовать Windows Authentication. С моей стороны все работает нормально. Пожалуйста, скажите мне детали ошибки.

Uri uri = new Uri("http://localhost:21011");
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.MessageEncoding = WSMessageEncoding.Mtom;
            binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

Или

Uri uri = new Uri("https://localhost:21011");
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.MessageEncoding = WSMessageEncoding.Mtom;
            binding.Security.Mode = BasicHttpSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

Вот мой пример.
Server-side.

class Program
{
    static void Main(string[] args)
    {
        Uri uri = new Uri("http://localhost:21011");
        BasicHttpBinding binding = new BasicHttpBinding();
        binding.MessageEncoding = WSMessageEncoding.Mtom;
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
        {
            sh.AddServiceEndpoint(typeof(IService), binding,"");
            ServiceMetadataBehavior smb;
            smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
            if (smb == null)
            {
                smb = new ServiceMetadataBehavior()
                {
                    HttpGetEnabled = true
                };
                sh.Description.Behaviors.Add(smb);
            }
            Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
            sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");


            sh.Opened += delegate
            {
                Console.WriteLine("Service is ready");
            };
            sh.Closed += delegate
            {
                Console.WriteLine("Service is clsoed");
            };
            sh.Open();
            Console.ReadLine();
            //pause
            sh.Close();
            Console.ReadLine();
        }
    }
}
[ServiceContract]
public interface IService
{
    [OperationContract]
    string Test();

}
public class MyService : IService
{
    public string Test()
    {
        return DateTime.Now.ToLongTimeString();
    }
}

Client-side. (вызов удаленной службы с помощью клиентский прокси)

static void Main(string[] args)
        {
            ServiceReference1.ServiceClient client = new ServiceClient();
            client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
            client.ClientCredentials.Windows.ClientCredential.Password = "abcd1234!";
            var result = client.Test();
            Console.WriteLine(result);

        }

Appconfig конфигурация на стороне клиента.

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" messageEncoding="Mtom">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://10.157.13.69:21011/" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
        name="BasicHttpBinding_IService" />
    </client>
  </system.serviceModel>

Не стесняйтесь позвать меня, если есть что-то, с чем я могу помочь.

...