我有一个首先使用实体框架/代码的 MVC 应用程序。我正在尝试设置始终加密以加密列(社会安全号码/ SSN)。我在 Azure 中运行一切,包括使用 Azure 保管库来存储密钥。
我有两个模型,SystemUser 和 Person。SystemUser 本质上是一个可以管理 1 个或多个 People 的帐户/登录名。
定义看起来有点像:
public class Person
{
[StringLength(30)]
[Column(TypeName = "varchar")]
public string SSN { get; set; } // Social Security Number
...
[Required, MaxLength(128)]
public string SystemUserID { get; set; }
[ForeignKey("SystemUserID")]
public virtual SystemUser SystemUser { get; set; }
...
}
public class SystemUser
{
...
[ForeignKey("SystemUserID")]
public virtual HashSet<Person> People { get; set; }
...
}
我有一个非常基本的页面设置,它只是查找用户并打印出他们的 SSN。这行得通。然后我调整了页面以更新 SSN,这也有效。这对我来说意味着 Always Encrypted 配置和 Azure Vault 设置正确。我在连接字符串中有“列加密设置=启用”,我使用 SSMS 加密了列 SSN(我正在使用确定性)。
在我的 SystemUser 类中,我有以下方法作为 Identity 的实现:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<SystemUser> manager)
{
...
if (this.People.Any())
{
...
}
...
}
这用于用户登录。运行代码会导致:
System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:操作数类型冲突:varchar 与使用 (encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK_Auto11',column_encryption_key_database_name = 'xxx' 加密的 varchar(30) 不兼容) collation_name = 'Latin1_General_BIN2'
它似乎在“if (this.People.Any())”上面的行上失败了。在该行之前放置一个断点会显示有关 this.People 的以下内容:
'((System.Data.Entity.DynamicProxies.SystemUser_9F939A0933F4A8A3724213CF7A287258E76B1C6775B69BD1823C0D0DB6A88360)this).People' 引发了类型为 'System.Data.Entity.Core.EntityCommandExecutionException' System.Collections.Generic.HashSet {System.Data.Entity.Core.实体命令执行异常}
这里有什么想法吗?我是否在做 Always Encrypted 不支持的事情?