使用PostSharp我想对字段拦截进行加密/解密
我有一个班级
public class guestbookentry
{
[Encryption] // This Attribute has to Encrypt and Decrypt
public string Message { get; set; }
public string GuestName { get; set; }
}
我在Azure Tables中保存对象。只有特定的字段必须得到En / Decrypt。
字段拦截的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.连续加密和解密发生,难以处理。
请建议
答案 0 :(得分:1)
注意,调用base.OnSetValue(args)
与调用args.ProceedSetValue()
相同,调用base.OnGetValue(args)
与调用args.ProceedGetValue()
相同。这意味着您在每个处理程序中调用 proceed 方法两次。
您需要做的是在args.ProceedGetValue()
开头致电OnGetValue
以阅读加密值,并在args.ProceedSetValue()
结束时致电OnSetValue
保存加密值。
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]
属性。在开发Developing Composite Aspects中描述的复合方面时使用它。