使用WCF服务创建MDS实体成员时遇身份验证错误求助
解决WCF调用MDS服务时的身份验证失败问题
我看了你遇到的问题——调用MDS的WCF服务创建实体成员时触发了System.ServiceModel.Security.SecurityNegotiationException,提示“调用方未通过服务的身份验证”。结合你的代码,我整理了几个关键的修复点,应该能帮你解决这个问题:
1. 修正WSHttpBinding的安全配置
默认的WSHttpBinding不会自动适配MDS服务常用的Windows身份验证模式,你需要显式配置绑定的安全规则:
private static ServiceClient GetClientProxy(string targetURL) { EndpointAddress endptAddress = new EndpointAddress(targetURL); WSHttpBinding wsBinding = new WSHttpBinding(); // 设置安全模式为TransportCredentialOnly(适用于HTTP而非HTTPS场景) wsBinding.Security.Mode = SecurityMode.TransportCredentialOnly; // 指定客户端凭证类型为Windows wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; return new ServiceClient(wsBinding, endptAddress); }
2. 调整凭证的设置方式
你的代码里用了UserName凭证,但MDS服务通常依赖Windows身份验证,建议改用Windows凭证方式:
try { clientProxy = GetClientProxy(mdsURL); // 直接设置Windows凭证,注意格式:用户名、密码、域名 clientProxy.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential( "user", "mypassword", "mydomain" ); // 如果要使用当前运行程序的账户身份,也可以用下面这行替代: // clientProxy.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; Console.WriteLine("Connected..."); } catch (Exception ex) { Console.WriteLine("Error creating a service proxy: {0}", ex); return; }
3. 确认账户权限与格式
- 确保你使用的账户
mydomain\user拥有MDS中目标模型(PDM)的实体成员创建权限,可以在MDS的Web界面里检查角色分配。 - 用户名格式要正确:域账户用
域\用户名,本地账户用机器名\用户名,代码里可以用@"mydomain\user"避免转义问题。
4. 额外排查步骤
- 先在浏览器中访问
http://myhost/MDS/service/Service.svc,输入你的账户密码,看是否能正常加载WSDL页面,这能快速验证账户是否有权访问服务。 - 查看服务器端的事件查看器,MDS或WCF相关日志会给出更详细的身份验证失败原因。
修改后的createEntityMember方法不需要改动,但建议在调用后添加错误处理,方便排查后续问题:
private static void createEntityMember(string modelName, string version, string entityName, string newName, string newCode, MemberType memberType) { EntityMembersCreateRequest createRequest = new EntityMembersCreateRequest(); createRequest.Members = new EntityMembers(); createRequest.ReturnCreatedIdentifiers = true; createRequest.Members.ModelId = new Identifier { Name = modelName }; createRequest.Members.VersionId = new Identifier { Name = version }; createRequest.Members.EntityId = new Identifier { Name = entityName }; createRequest.Members.MemberType = memberType; createRequest.Members.Members = new System.Collections.ObjectModel.Collection<Member> { }; Member newMember = new Member(); newMember.MemberId = new MemberIdentifier() { Name = newName, Code = newCode, MemberType = memberType }; createRequest.Members.Members.Add(newMember); try { EntityMembersCreateResponse createResponse = clientProxy.EntityMembersCreate(createRequest); // 检查操作结果是否有错误 if (createResponse.OperationResult != null && createResponse.OperationResult.Errors.Any()) { foreach (var error in createResponse.OperationResult.Errors) { Console.WriteLine("MDS Operation Error: {0}", error.Description); } } else { Console.WriteLine("Member created successfully!"); } } catch (Exception ex) { Console.WriteLine("Error creating member: {0}", ex); } }
内容的提问来源于stack exchange,提问作者Yura NoMatter
相关产品推荐
相关产品推荐

