在我的 wcf 服务中验证 AX 服务器域、用户名和密码等凭据后,下载 Microsoft Dynamics AX 2012 服务 wsdl 元数据

Posted

技术标签:

【中文标题】在我的 wcf 服务中验证 AX 服务器域、用户名和密码等凭据后,下载 Microsoft Dynamics AX 2012 服务 wsdl 元数据【英文标题】:Download Microsoft Dynamics AX 2012 service wsdl metadata after validating credentials like AX server domain, user name and password in my wcf service 【发布时间】:2020-06-24 07:57:52 【问题描述】:

我对这个 Microsoft Dynamics AX 2012 工具和 WCF 服务完全陌生。我有一个自托管的 WCF 服务,它需要 AX 2012 服务 wsdl URL、AX 服务器域名、用户名和密码作为输入,并将尝试下载此 wsdl url 的元数据,而无需任何用户身份验证机制。

MY AX 2012 服务 WSDl 网址如下: 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.");      

但上面的代码不会打扰用户凭据验证,它直接从 WSDL URL 下载元数据,但我希望验证用户凭据并在成功验证后下载元数据。

请帮助我在支持跨平台的 wshttpbinding 之上引入一些身份验证方法。

【问题讨论】:

【参考方案1】:

我不完全理解你的意思。您是否尝试使用自定义用户名/密码身份验证创建 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 如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

以上是关于在我的 wcf 服务中验证 AX 服务器域、用户名和密码等凭据后,下载 Microsoft Dynamics AX 2012 服务 wsdl 元数据的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用 LDAP 身份验证,为啥必须在我的用户域中存储密码列?

WCF 服务中的自定义证书验证

使用另一个用户名启动服务后,WCF 给出错误 10061

关于vue项目请求WCF服务跨域的问题(后台设置)

将 Windows 用户“令牌”传递给 WCF 进行身份验证

WCF 服务中的自定义客户端证书和用户名验证