在我的 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 身份验证,为啥必须在我的用户域中存储密码列?