0

是否有人尝试使用 Windows 凭据在 CRM 2011 (On-Premise) 中创建 OrganizationServiceProxy 实例?我有一个 WCF 服务,它使用

      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"/>
      </security>

并且我能够确认用户已通过身份验证(OperationContext.Current.ServiceSecurityContext.WindowsIdentity.IsAuthenticated),但我不知道如何生成/传递 ClientCredentials 以创建 CRM 服务的实例。这是从不在 CRM 内的 IFrame 中的 Silverlight 应用程序调用的。

谢谢。

4

1 回答 1

1

您需要使用单独的用户帐户登录到OrganizationServiceProxy. 您将无法检索 Windows 凭据以传递给代理进行身份验证。

您使用的用户需要prvActOnBehalfOfAnotherUser与之关联的权限。

完成此操作后,您可以成功登录并检索有效的 OrganizationServiceProxy,作为服务的使用者,您需要做的是在调用操作时指定 CallerId。您应该使用 .xrm 从 xrm 模型中检索此令牌Xrm.Page.context.getUserId。看。http://msdn.microsoft.com/en-us/library/gg334511.aspx

然后从 silverlight,您将使用System.Windows.Browser.ScriptObject桥接器执行客户端 javascript 以检索登录到 crm 的当前用户的用户 ID。最好在应用程序引导时执行此操作并将值保存到 applicationdata 变量中,以便可以从您的 silverlight 应用程序中全局访问它。

例如。客户端脚本。

function CrmContext() {
}

var context = null;
with (window.parent) {
    context = Xrm.Page.context;}

CrmContext.prototype.ReadUserId = function () {
   var userId = context.getUserId();
   return userId;
}

获得用户令牌后,使用此值设置代理 CallerId

例如。

private OrganizationServiceProxy Proxy { get; set; }

public Guid Create(CreateEntity request)
{
    if (request == null || request.UserId == Guid.Empty || request.Entity == null)
    {
        throw new InvalidMessageException("Invalid reqest message. Please provide compulsory criteria");
    }

    var result = Guid.Empty;

    try
    {
        if (Proxy != null)
        {
            Proxy.CallerId = request.UserId;

            using (Proxy)
            {
                result = Proxy.Create(request.Entity);
            }
        }
    }
    catch (FaultException<OrganizationServiceFault> e)
    {
        Log.Error(e.Message);
        throw new IntegrationException(e.Message);
    }

    return result;
}

解决此问题的方法是创建一个封装 crm 代理的 crm 适配器,并将请求对象发送到包含用户令牌的服务接口。

public OrganizationServiceAdapter(ICrmConfigurationContext crmConfigurationConext)
{
    try
    {
        Proxy = new OrganizationServiceProxy(
            crmConfigurationConext.OrganizationServiceConfiguration,
            crmConfigurationConext.Credentials);
    }
    catch (Exception e)
    {
        //// TODO: Add local proxy pattern implementation for failover
        Proxy = null;
        Log.Error(e.Message);
        throw new IntegrationException(ExceptionMessages.CouldNotLoginToOrganizationService());
    }
}
于 2011-07-15T11:14:37.707 回答