我正在CRM2016内部开发一个自定义插件(非沙盒),以与内部webAPI连接。
当我运行这段代码时,它将返回CRM App Pool用户而不是我的用户名:
(System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;
预期和正常吗?如果是,您如何模拟主叫用户进行外部呼叫。
感谢。
答案 0 :(得分:0)
是的,这是正常的,同步插件在Web服务器上运行,因此需要获取IIS App Pool用户。如果插件以异步方式运行,则它会在后端异步服务上运行,因此您可能会获得不同的服务帐户。
您可以检查插件执行上下文(IPluginExecutionContext)以获取InitiatingUserId
或UserId
,这是插件正在执行的系统用户帐户的CRM GUID,具体取决于如何在插件上执行和注册,这可以为您提供启动插件的用户的CRM身份。
该信息可在PluginExecutionContext中找到。代码 下面是您的插件必须实现的Execute方法。
public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); Guid userId = context.InitiatingUserId; }
仅供参考,上下文还有一个" UserId"可能会或可能不会的财产 与InitiatingUserId相同。如果您的插件步骤注册 "在用户的上下文中运行"字段具有值"呼叫用户",然后它们 会是一样的。如果您在"在用户中运行指定了用户 上下文"字段,然后UserId字段将包含的用户ID 您指定的人和InitiatingUserId将是实际的CRM 用户的操作触发了插件。听起来像你在寻找 InitiatingUserId。
或许您可以使用其他指标,例如上次修改某些记录的人。然后,您可以在CRM中查找其详细信息,例如获取他们的域名。
根据您对外部服务进行身份验证的方式,这可能有助于模拟用户。否则,据我所知,没有简单的方法来获取用户安全令牌,例如,CRM并没有真正公开这些信息。