繁体   English   中英

在MS Dynamics CRM Online中检索时创建一个插件来解密Case Entity的自定义字段

[英]Create a plugin to decrypt custom field of Case Entity while Retrieve in MS Dynamics CRM Online

我要求在MS Dynamics CRM在线门户中查看案例时自动加密自定义字段和解密。 我创建了两个插件是一个用于加密在PreCaseCreate,另一种是在PostCaseRetrieve .The插件来解密加密工作正常,但插件解密不工作(这意味着加密内容不解密,而在观看在线门户网站)。 以下是解密代码

// <copyright file="PostCaseRetrieve.cs" company="">
// Copyright (c) 2016 All Rights Reserved
// </copyright>
// <author></author>
// <date>4/20/2016 1:58:24 AM</date>
// <summary>Implements the PostCaseRetrieve Plugin.</summary>
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
// </auto-generated>

namespace CRMCaseEntityDecryptPlugin.Plugins
{
using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using System.Text;
using System.Security.Cryptography;
using Microsoft.Xrm.Sdk.Query;

/// <summary>
/// PostCaseRetrieve Plugin.
/// </summary>    
public class PostCaseRetrieve : Plugin
{
    /// <summary>
    /// Initializes a new instance of the <see cref="PostCaseRetrieve"/> class.
    /// </summary>
    public PostCaseRetrieve()
        : base(typeof(PostCaseRetrieve))
    {
        base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Retrieve", "incident", new Action<LocalPluginContext>(ExecutePostCaseRetrieve)));

        // Note : you can register for more events here if this plugin is not specific to an individual entity and message combination.
        // You may also need to update your RegisterFile.crmregister plug-in registration file to reflect any change.
    }

    /// <summary>
    /// Executes the plug-in.
    /// </summary>
    /// <param name="localContext">The <see cref="LocalPluginContext"/> which contains the
    /// <see cref="IPluginExecutionContext"/>,
    /// <see cref="IOrganizationService"/>
    /// and <see cref="ITracingService"/>
    /// </param>
    /// <remarks>
    /// For improved performance, Microsoft Dynamics CRM caches plug-in instances.
    /// The plug-in's Execute method should be written to be stateless as the constructor
    /// is not called for every invocation of the plug-in. Also, multiple system threads
    /// could execute the plug-in at the same time. All per invocation state information
    /// is stored in the context. This means that you should not use global variables in plug-ins.
    /// </remarks>
    protected void ExecutePostCaseRetrieve(LocalPluginContext localContext)
    {
        if (localContext == null)
        {
            throw new ArgumentNullException("localContext");
        }

        // TODO: Implement your custom Plug-in business logic.
        IPluginExecutionContext context = localContext.PluginExecutionContext;
        IOrganizationService service = localContext.OrganizationService;
        // The InputParameters collection contains all the data passed in the message request.
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
        {
            // Obtain the target entity from the input parmameters.
            Entity entity = (Entity)context.InputParameters["Target"];
            if (entity.LogicalName.ToLower().Equals("incident"))
            {
                try
                {
                    ColumnSet cols = new ColumnSet(new String[] { "title", "description", "new_phicontent" });
                    var incident = service.Retrieve("incident", entity.Id, cols);
                    if (incident.Attributes.Contains("new_phicontent"))
                    {
                        string PHIContent = incident.Attributes["new_phicontent"].ToString();
                        byte[] bInput = Convert.FromBase64String(PHIContent);

                        UTF8Encoding UTF8 = new UTF8Encoding();
                        //Encrypt/Decrypt strings which in turn uses 3DES (Triple Data Encryption standard) algorithm
                        TripleDESCryptoServiceProvider tripledescryptoserviceprovider = new TripleDESCryptoServiceProvider();

                        //Alow to compute a hash value for Encryption/Decryption
                        MD5CryptoServiceProvider md5cryptoserviceprovider = new MD5CryptoServiceProvider();

                        tripledescryptoserviceprovider.Key = md5cryptoserviceprovider.ComputeHash(ASCIIEncoding.ASCII.GetBytes("secretkey"));
                        tripledescryptoserviceprovider.Mode = CipherMode.ECB;
                        ICryptoTransform icryptotransform = tripledescryptoserviceprovider.CreateDecryptor();

                        string DecryptedText = UTF8.GetString(icryptotransform.TransformFinalBlock(bInput, 0, bInput.Length));
                        incident["new_phicontent"] = DecryptedText;
                        service.Update(incident);
                    }

                }
                catch (FaultException ex)
                {
                    throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex);
                }
            }
        }
    }

}

}

我也尝试过PreCaseRetrieve事件,但我没有得到结果

请提供一些解决方案来解决这个问题。 提前致谢

将您的插件保留为帖子插件。

Target从对象InputParameters是发送到客户端的对象,因此,如果您修改目标对象,修改什么被发送到客户端。 所以不要检索incident然后更新incident 相反,如果entity包含new_phicontent属性,那么您知道客户端请求了该属性,并且需要对其进行解密以解密该值,然后更新entity["new_phicontent"] 这是更新的代码:

// Obtain the target entity from the input parmameters.
Entity entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName.ToLower().Equals("incident"))
{
    try
    {
        if (entity.Attributes.Contains("new_phicontent"))
        {
            string PHIContent = entity.Attributes["new_phicontent"];
            byte[] bInput = Convert.FromBase64String(PHIContent);

            // removed for brevity

            string decryptedText = UTF8.GetString(icryptotransform.TransformFinalBlock(bInput, 0, bInput.Length));
            entity["new_phicontent"] = decryptedText;
        }
    }
    catch (FaultException ex)
    {
        throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM