Загрузите метаданные wsdl службы Microsoft Dynamics AX 2012 после проверки учетных данных, таких как домен сервера AX, имя пользователя и пароль, в моей службе wcf - PullRequest
0 голосов
/ 12 марта 2020

Я совершенно новичок в этом инструменте Microsoft Dynamics AX 2012 и службе WCF. У меня есть собственная служба WCF, в которой она принимает URL-адрес wsdl службы AX 2012, доменное имя сервера AX, имя пользователя и пароль и будет пытаться загрузить метаданные этого URL-адреса wsdl без какого-либо механизма аутентификации пользователя.

URL-адрес WSDl службы MY AX 2012 ниже: http: // ####: 8 ## 1 / DynamicsAx / Services / TestService? Wsdl ---> WSDLEndpoint

Я динамически создаю WSHttpBinding, MetadataExchangeClient, назначил все его свойства и передал мою конечную точку wsdl.

Ниже приведен мой пример кода:

var binding = new WSHttpBinding(SecurityMode.None) { MaxReceivedMessageSize = int.MaxValue, MaxBufferPoolSize = int.MaxValue };
var mexClient = new MetadataExchangeClient(binding)
{
    ResolveMetadataReferences = true,
    MaximumResolvedReferences = int.MaxValue,
    OperationTimeout = TimeSpan.FromSeconds(TimeOutInSeconds),
    HttpCredentials =
                            new NetworkCredential(Username, Password, Domain)
};
mexClient.GetMetadata(new Uri(WSDLEndpoint), MetadataExchangeClientMode.HttpGet);
Log.Info("Metadata successfully downloaded.");      

Но код выше не будет беспокоиться о проверке учетных данных пользователя, он напрямую загружает метаданные из URL-адреса WSDL, но я пытаюсь проверить учетные данные пользователя и после успешной аутентификации загрузит метаданные.

Пожалуйста, помогите мне с некоторым подходом к аутентификации представить поверх wshttpbinding, который поддерживает кроссплатформенность.

1 Ответ

0 голосов
/ 13 марта 2020

Я не совсем понимаю ваш смысл. Вы пытаетесь создать службу WCF с пользовательской аутентификацией по имени пользователя и паролю? Это требует, чтобы мы настроили сертификат на стороне сервера. Я создал пример, желая, чтобы он был полезным для вас.
На стороне сервера.

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:21011");
            WSHttpBinding binding = new WSHttpBinding();
            binding.Security.Mode = SecurityMode.Message;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

            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);
                }
                sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "5ba5022f527e32ac02548fc5afc558de1d314cb6");

                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.ToString();
        }

}

На клиентской стороне мы создаем клиентский прокси, добавляя ссылку на сервис.

ServiceReference1.ServiceClient client = new ServiceClient();
            client.ClientCredentials.UserName.UserName = "administrator";
            client.ClientCredentials.UserName.Password = "abcd1234!";
            var result = client.Test();
            Console.WriteLine(result);

Конфигурация, автоматически генерируемая на стороне клиента.

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IService">
          <security>
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://10.157.13.69:21011/" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IService" contract="ServiceReference1.IService"
        name="WSHttpBinding_IService">
        <identity>
          <certificate encodedValue="blabla… " />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

В приведенном выше примере клиент должен предоставить имя пользователя / пароль для аутентификации на сервере, чтобы вызвать удаленную службу.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/message-security-with-a-user-name-client
Feel дайте мне знать, если я могу чем-то помочь.

...