Что нужно для использования отдельной учетной записи пользователя для входа в систему 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());
}
}