Encryption 用于加密和解密的PostSharp字段拦截

Encryption 用于加密和解密的PostSharp字段拦截,encryption,field,postsharp,interception,Encryption,Field,Postsharp,Interception,我想使用PostSharp对字段拦截进行加密/解密 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using PostSharp; using PostSharp.Aspects; using EncryptionDecryption; using PostSharp.Serialization; using P

我想使用PostSharp对字段拦截进行加密/解密

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PostSharp;
using PostSharp.Aspects;
using EncryptionDecryption;
using PostSharp.Serialization;
using PostSharp.Aspects.Advices;
using PostSharp.Extensibility;

namespace GuestBook_Data
{
[Serializable]
public class EncryptionAttribute : LocationInterceptionAspect 
{      
    [MulticastPointcut(Targets = MulticastTargets.Field, Attributes = MulticastAttributes.Instance)]
    public override void OnSetValue(LocationInterceptionArgs args)
    {
        base.OnSetValue(args);
        if (args.Value != null)
        {             
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Encrypt(args.Value.ToString()).Replace(" ", "+");
            args.ProceedSetValue();
        } 
    }

    public override void OnGetValue(LocationInterceptionArgs args)
    {
        base.OnGetValue(args);
        if (args.Value != null)
        {              
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Decrypt(args.Value.ToString()); //objMD5Encrypt.Decrypt(args.Value.ToString());
            args.ProceedGetValue();
        }
    } 
}
}
我有一节课

public class guestbookentry
  {       
    [Encryption]  // This Attribute has to Encrypt and Decrypt
    public string Message { get; set; }
    public string GuestName { get; set; }       
  }
我正在Azure表中保存该对象。只需对特定字段进行get En/解密

场截获的PostSharp属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PostSharp;
using PostSharp.Aspects;
using EncryptionDecryption;
using PostSharp.Serialization;
using PostSharp.Aspects.Advices;
using PostSharp.Extensibility;

namespace GuestBook_Data
{
[Serializable]
public class EncryptionAttribute : LocationInterceptionAspect 
{      
    [MulticastPointcut(Targets = MulticastTargets.Field, Attributes = MulticastAttributes.Instance)]
    public override void OnSetValue(LocationInterceptionArgs args)
    {
        base.OnSetValue(args);
        if (args.Value != null)
        {             
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Encrypt(args.Value.ToString()).Replace(" ", "+");
            args.ProceedSetValue();
        } 
    }

    public override void OnGetValue(LocationInterceptionArgs args)
    {
        base.OnGetValue(args);
        if (args.Value != null)
        {              
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Decrypt(args.Value.ToString()); //objMD5Encrypt.Decrypt(args.Value.ToString());
            args.ProceedGetValue();
        }
    } 
}
}
问题是 1.连续的加密和解密是很难处理的


请注意,调用
base.OnSetValue(args)
与调用
args.ProceedSetValue()
相同,调用
base.OnGetValue(args)
与调用
args.ProceedGetValue()
相同。这意味着您在每个处理程序中调用两次继续方法

您需要做的是在
OnGetValue
开头调用
args.ProceedGetValue()
读取加密值,并在
OnSetValue
结尾调用
args.ProceedSetValue()
保存加密值

public override void OnGetValue(LocationInterceptionArgs args)
{
    args.ProceedGetValue();
    if (args.Value != null)
    {
        args.Value = // decrypt
    }
}

public override void OnSetValue(LocationInterceptionArgs args)
{
    if (args.Value != null)
    {
        args.Value = // encrypt
    }
    args.ProceedSetValue();
}
此外,您不需要应用
[MulticastPointcut]
属性。如中所述,它用于开发复合方面