我使用svcutil.exe为我的CRM 2013数据库创建了一个XrmServiceContext
,这非常有效,我可以在我的MVC4应用程序中从CRM中检索数据。
我的网站使用ADFS2运行SSO,我可以使用以下方法检索访问用户身份:
Microsoft.IdentityModel.Claims.IClaimsIdentity ci = Thread.CurrentPrincipal.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity;
var accountNameClaim = ci.Claims.Where(x => x.ClaimType.ToLower().EndsWith("windowsaccountname")).FirstOrDefault();
这给了我一些类似
的内容 string accountNameClaim = "firstname.lastname@domain.com"
使用此功能,我可以检索用户表单CRM 2013 XrmServiceContext
var user = _serviceContext.SystemUserSet
.Where( x=> x.DomainName == accountNameClaim)
.Select(s => new UserInformationProxy()
{
Id = s.Id, // this is probably needed for impersonation
FullName = s.FullName,
DomainName = s.DomainName
})
.FirstOrDefault();
现在,我想知道我是如何使用我的XRMServiceContext对CRM的所有后续查询充当/模仿此用户。
此页面http://msdn.microsoft.com/en-us/library/gg309629.aspx有一个指南,建议我需要在CallerID
中设置一个名为OrganizationServiceContext
的变量,我猜测它包含在XRMServiceContext
内的某个位置。但我找不到它。
答案 0 :(得分:0)
CallerId
属性不在OrganizationServiceContext
上,而在上下文 使用的OrganizationServiceProxy
上:
在构建上下文时,您将传入组织服务。在此之前,您需要设置CallerId
:
organizationService.CallerId = user.Id;
var _serviceContext = new OrganizationServiceContext(organizationService);
请注意,CallerId
仅适用于OrganizationServiceProxy
类型,不适用于IOrganiaztionService
接口。我看不到你如何获得组织服务,但确保它是一个OrganizationServiceProxy。