我们希望在MS CRM Dynamics中实施“记录级安全性”。在用户和案例实体上,我们有一个 OptionSet ,其值低于值,Optionset有很多值,下面只是简单的值:< / p>
- 第1类
- 第2类
我们希望限制第1类用户仅查看第1类案例,并限制第2类用户仅查看第2类案例。
到目前为止我做了什么?
我认为这应该可以通过检索插件实现,但是在我编写代码之后......我发现当我尝试打开案例记录时,检索插件会触发5次。它也不会抛出我的自定义错误。
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
tracer.Trace("context.Depth = " + context.Depth);
if (context.Depth > 1)
return;
tracer.Trace("context.Stage = " + context.Stage);
tracer.Trace("context.MessageName = " + context.MessageName);
EntityReference entityReference = (EntityReference)context.InputParameters["Target"];
tracer.Trace("entityReferencee = " + entityReference.LogicalName);
if (context.OutputParameters != null && context.OutputParameters.Contains("BusinessEntity"))
{
if (context.OutputParameters["BusinessEntity"] is Entity)
{
Entity entity = (Entity)context.OutputParameters["BusinessEntity"];
tracer.Trace("entity.LogicalName = " + entity.LogicalName);
context.OutputParameters["BusinessEntity"] = null;
throw new Exception("You can not view this record.");
}
else
{
tracer.Trace("BusinessEntity entity is not an entity.");
}
}
else
{
tracer.Trace("BusinessEntity entity is null");
}
}
日志文件的详细信息如下:
未处理的例外情况: System.ServiceModel.FaultException`1 [Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk,Version = 7.0.0.0,Culture = neutral, PublicKeyToken = 31bf3856ad364e35]]:System.Web.HttpUnhandledException: Microsoft Dynamics CRM遇到错误。参考编号 管理员或支持:#CF526D62详细信息:
-2147220970 System.Web.HttpUnhandledException:Microsoft Dynamics CRM遇到了错误。管理员或参考号 支持:#CF526D62
2015-09-21T12:33:00.6154994Z -2147220956 插件出现意外异常(Execute):RestrictUserAccess.Case:System.Exception:你无法查看 记录。 2015-09-21T12:33:00.6154994Z[RestrictUserAccess:RestrictUserAccess.Case] [c8860cb6-4260-e511-80ea-3863bb3600d8:RestrictUserAccess.Case: 检索事件]
context.Depth = 1 context.Stage = 40 context.MessageName = Retrieve entityReferencee =事件entity.LogicalName =事件
答案 0 :(得分:1)
您的代码 会抛出异常,但CRM平台将其视为意外错误。 (只需阅读日志详细信息。)
当您需要发出功能错误信号时,您必须抛出InvalidPluginExecutionException
。
系统本身可能多次检索相同的Case记录。您的网络表单或功能区中的脚本也可以负责检索相同的记录,例如,何时需要评估记录状态。
因此,在检索Case记录时抛出异常可能不是一个有用的解决方案。另一种方法是通过从Entity.Attributes
集合中删除它们来清除检索中的所有(或所有敏感)字段。