Dynamics 365 SDK引发异常“安全支持提供程序接口(SSPI)协商失败”

时间:2019-01-15 22:14:02

标签: dynamics-crm microsoft-dynamics dynamics-365

我正在通过Microsoft.Xrm.Sdk + Microsoft.Pfe.Xrm.Core NuGet程序包跨Active Directory域连接到Dynamics 365 v9.0内部组织,以触发SDK请求。有时我会收到异常消息:The Security Support Provider Interface (SSPI) negotiation failed

我的机器和Dynamics服务器位于不同的域中。提琴手的痕迹表明,这两台计算机都可以在网络中访问。

PFE库中引发了异常,更具体地说是下面的operation()行。

Parallel.ForEach<TRequest, ParallelOrganizationOperationContext<TRequest, bool>>(requests,
    new ParallelOptions() { MaxDegreeOfParallelism = this.MaxDegreeOfParallelism },
    () => new ParallelOrganizationOperationContext<TRequest, bool>(),
    (request, loopState, index, context) =>
    {
        try
        {
            operation(request, threadLocalProxy.Value);
        }
        catch (FaultException<OrganizationServiceFault> fault)
        {
            //Track faults locally                                
            if (errorHandler != null)
            {
                context.Failures.Add(new ParallelOrganizationOperationFailure<TRequest>(request, fault));
            }
            else
            {
                throw;
            }
        }

        return context;
    },
    (context) =>
    {
        //Join faults together
        Array.ForEach(context.Failures.ToArray(), f => allFailures.Add(f));
    });

来源:https://github.com/seanmcne/XrmCoreLibrary/blob/8892a9e93c42d8c35aac2a212588d45359cfd1a2/v8/Client/ParallelServiceProxy.cs#L236

1 个答案:

答案 0 :(得分:0)

Sandrino Di Mattia在Early binding tips and tricks for Dynamics CRM 2011文章中提供了一种解决方法:

  

如果您使用的虚拟机是另一个域的一部分,则可能会出现此错误(跨域调用)。要解决此问题,您需要更改将身份验证参数传递给CrmSvcUtil.exe的方式,而不是使用以下行来调用CrmSvcUtil.exe:

    CrmSvcUtil.exe /url:"http:/srv/org/XRMServices/2011/Organization.svc" /out:Context.cs
    /username:"sandrino" /password:"pass" /domain:"somedomain" /serviceContextName:Context
     

将其更改为以下内容:

    CrmSvcUtil.exe /url:"http:/srv/org/XRMServices/2011/Organization.svc" /out:Context.cs
    /username:"sandrino@somedomain" /password:"pass" /serviceContextName:Context
     

通过删除domain参数并将域附加到用户名(用@符号分隔),您将解决跨域问题。