代表不同的用户/ XrmServiceContext.CallerID

时间:2013-12-16 12:55:22

标签: asp.net-mvc-4 c#-4.0 claims-based-identity dynamics-crm-2013

我使用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内的某个位置。但我找不到它。

1 个答案:

答案 0 :(得分:0)

CallerId属性不在OrganizationServiceContext上,而在上下文 使用的OrganizationServiceProxy上:

在构建上下文时,您将传入组织服务。在此之前,您需要设置CallerId

organizationService.CallerId = user.Id;
var _serviceContext = new OrganizationServiceContext(organizationService);

请注意,CallerId仅适用于OrganizationServiceProxy类型,不适用于IOrganiaztionService接口。我看不到你如何获得组织服务,但确保它是一个OrganizationServiceProxy。