Использование учетных данных Windows для создания экземпляра OrganizationServiceProxy в CRM 2011 - PullRequest
0 голосов
/ 10 июня 2011

Кто-нибудь пытался использовать учетные данные Windows для создания экземпляра OrganizationServiceProxy в CRM 2011 (On-Premise)?У меня есть служба WCF, которая использует

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

, и я могу подтвердить, что пользователь аутентифицирован (OperationContext.Current.ServiceSecurityContext.WindowsIdentity.IsAuthenticated), но я не знаю, как сгенерировать / передатьClientCredentials для создания экземпляра службы CRM.Это вызывается из приложения Silverlight, которое не находится в IFrame внутри CRM.

Спасибо.

1 Ответ

1 голос
/ 15 июля 2011

Что нужно для использования отдельной учетной записи пользователя для входа в систему OrganizationServiceProxy. Вы не сможете получить учетные данные Windows для передачи прокси-серверу для аутентификации.

Пользователь, которому вы пользуетесь, нуждается в привилегии prvActOnBehalfOfAnotherUser, связанной с ним.

Как только это будет сделано, и вы сможете успешно войти в систему и получить действительный OrganizationServiceProxy, вам, как потребителю услуги, необходимо указать CallerId всякий раз, когда вы вызываете операции с ним. Этот токен вы должны получить из модели xrm, используя Xrm.Page.context.getUserId. Увидеть. http://msdn.microsoft.com/en-us/library/gg334511.aspx.

Тогда из silverlight вы будете использовать мост System.Windows.Browser.ScriptObject для выполнения клиентского JavaScript-кода для получения идентификатора пользователя текущего пользователя, вошедшего в crm. Желательно делать это во время начальной загрузки приложения и сохранить значение в переменной applicationdata, чтобы иметь к нему глобальный доступ из приложения silverlight.

Например. клиентского скрипта.

function CrmContext() {
}

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

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

Получив токен пользователя, установите Proxy 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());
    }
}
...