【发布时间】:2020-03-03 14:47:24
【问题描述】:
我已经为我的 Dynamics CRM 实现了一个插件,该插件在事件实体的更新消息上触发。 我还为外部用户提供了一个 Web 服务,它可以从外部仅更新事件实体的两个属性。
问题是当外部用户使用网络服务更新实体时,插件也会触发。 我想绑定在事件实体发生更改时将在 CRM 内部触发的插件,并防止它被外部请求触发。
我在我的插件中检查了以下条件以防止无限循环,它可以工作,但不能用于防止外部更新请求触发。
if (context.Depth > 1 ||
context.Mode != 1 ||
context.MessageName != "Update" ||
context.IsolationMode != 1)
{
return;
}
要注册插件,我使用了插件注册工具,并将步骤消息设置为更新,并在用户上下文中作为调用用户运行。
在我的网络服务中,我使用 Xrm.Sdk 和 Xrm.Sdk.Client 连接到 CRM 并直接更新实体。
ColumnSet cs = new ColumnSet(new string[] {
"description", "statuscode"
});
Guid recordId = new Guid(caseID);
Entity currentRecord = crmService.Retrieve("incident", recordId, cs);
OptionSetValue osv = new OptionSetValue(1);
currentRecord["statuscode"] = osv;
currentRecord["new_answers"] = answer;
currentRecord["new_lastanswerdate"] = currentDate;
crmService.Update(currentRecord);
任何人都有任何想法 - 当实体从 CRM 外部更新时,如何防止插件触发?
【问题讨论】:
-
由于您使用的是调用用户,您可以在插件执行上下文中通过
InitiatingUserId获取有关用户的信息。使用 Guid,您可以检查您的用户表并确定它们是否是外部的 -
@Chronicle 是否需要定义专门用于通过 Web 服务连接到 CRM 的特定用户?如果是,我可以将哪个角色分配给新用户凭据以限制任何其他操作?
-
如果您创建了一个自定义角色并只为 Web 服务用户分配此角色,那么这是一种限制插件功能的方式 - 如果用户具有该角色,请检查您的代码,否则返回。但它不一定是角色,您也可以在用户表中添加一个标志字段,并为该用户设置该标志,这样您就不必为每个服务添加新角色
-
看看这个:应用程序用户(非交互式用户)docs.microsoft.com/en-us/power-platform/admin/…
-
感谢@Chronicle,将插件执行绑定到除新用户之外的所有用户都运行良好。
标签: c# plugins dynamics-crm