رمزنگاری خودکار فیلدها توسط Entity Framework Core
نویسنده: وحید نصیری
تاریخ: ۱۳۹۸/۰۱/۱۵ ۱۹:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class Rider
{
public int Id { get; set; }
public EquineBeast Mount { get; set; }
}
public enum EquineBeast
{
Donkey,
Mule,
Horse,
Unicorn
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(
v => v.ToString(),
v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
} var converter = new ValueConverter<EquineBeast, string>(
v => v.ToString(),
v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(converter); var converter = new EnumToStringConverter<EquineBeast>();
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(converter); modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion<string>(); public class Rider
{
public int Id { get; set; }
[Column(TypeName = "nvarchar(24)")]
public EquineBeast Mount { get; set; }
} namespace DbConfig.Web.DataLayer.Context
{
public class MyAppContext : DbContext
{
// …
protected override void OnModelCreating(ModelBuilder builder)
{
var encryptedConverter = new ValueConverter<string, string>(
convertToProviderExpression: v => new string(v.Reverse().ToArray()), // encrypt
convertFromProviderExpression: v => new string(v.Reverse().ToArray()) // decrypt
);
// Custom application mappings
builder.Entity<ConfigurationValue>(entity =>
{
entity.Property(e => e.Value).IsRequired().HasConversion(encryptedConverter);
});
}
}
} using System;
namespace Test
{
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class EncryptedAttribute : Attribute
{ }
} namespace DbConfig.Web.DomainClasses
{
public class ConfigurationValue
{
public int Id { get; set; }
public string Key { get; set; }
[Encrypted]
public string Value { get; set; }
}
} namespace DbConfig.Web.DataLayer.Context
{
public class MyAppContext : DbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
var encryptedConverter = new ValueConverter<string, string>(
convertToProviderExpression: v => new string(v.Reverse().ToArray()), // encrypt
convertFromProviderExpression: v => new string(v.Reverse().ToArray()) // decrypt
);
foreach (var entityType in builder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
var attributes = property.PropertyInfo.GetCustomAttributes(typeof(EncryptedAttribute), false);
if (attributes.Any())
{
property.SetValueConverter(encryptedConverter);
}
}
}
} Executed DbCommand (22ms)
[Parameters=[@p1='1',
@p0='.tset ot eulav wen A' (Nullable = false) (Size = 4000)],
CommandType='Text', CommandTimeout='180']
SET NOCOUNT ON;
UPDATE [Configurations] SET [Value] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT; db.Set<ConfigurationValue>().Where(x => x.Value.EndsWith("world!")) SELECT [x].[Id], [x].[Key], [x].[Value] FROM [Configurations] AS [x] WHERE RIGHT([x].[Value], LEN(N'world!')) = N'!dlrow'
public class MyEntity
{
public Guid Id {get;set;}
public string[] Strings { get; set; }
} modelBuilder.Entity<MyEntity>()
.Id(e=> e.Id)
.Property(e => e.Strings)
.HasConversion(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries)); {
"name":"dotnettips"
} {
"name":"DZTFwWzZe7CCypYxqhl+PQ=="
} var encryptedConverter = new ValueConverter<string, string>(
convertToProviderExpression: v => v, // How to save it: Do nothing --> Save it normally in the DB
convertFromProviderExpression: v => new string(v.Reverse().ToArray()) // How to report it: Show it encrypted to the user
); protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
base.ConfigureConventions(configurationBuilder);
configurationBuilder.Properties<int[]>()
.HaveConversion<IntArrayConverter>();
} public class IntArrayConverter:ValueConverter<int[], string>
{
public IntArrayConverter()
: base(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(x=>int.Parse((string)x)).ToArray())
{
}
}