在MS Dynamics中记录级安全性

时间:2015-09-21 10:11:59

标签: dynamics-crm dynamics-crm-2015

我们希望在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");
        }
    }

这是插件的注册方式: enter image description here

错误: enter image description here

日志文件的详细信息如下:

  

未处理的例外情况:   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 =事件

     

  

1 个答案:

答案 0 :(得分:1)

您的代码 会抛出异常,但CRM平台将其视为意外错误。 (只需阅读日志详细信息。)

当您需要发出功能错误信号时,您必须抛出InvalidPluginExecutionException

系统本身可能多次检索相同的Case记录。您的网络表单或功能区中的脚本也可以负责检索相同的记录,例如,何时需要评估记录状态。

因此,在检索Case记录时抛出异常可能不是一个有用的解决方案。另一种方法是通过从Entity.Attributes集合中删除它们来清除检索中的所有(或所有敏感)字段。