You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:56:02