ASP.NET 核心 MVC。 IDataProtectionKeyContext 接口的实现

ASP.NET Core MVC. Implementation of the IDataProtectionKeyContext interface

有一个数据上下文:

public class OurDbContext : DbContext, IOurDbContext, IDataProtectionKeyContext
{
    public DbSet<Employee> Employees { get; set; }
    
    public DbSet<Role> Roles { get; set; }
    
    public DbSet<DataProtectionKey> DataProtectionKeys { get; set; } = null!;
}

有一个实现向数据库发送数据的方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateNewClient(Employee client, string TypeOfClient)
{
    var secstring = _protector.Protect(client.Password);

    Employee temp = new Employee
    {
        Name = client.Name,
        Password = secstring,
        RoleId = 1
    };
    await _mediatr.Send(new NewEmployee.NewEmployeeCommand(temp));
    return Redirect("~/");
}

没有任何内容进入数据库。

如果从上下文中删除实现 class IDataProtectionKeyContext

public DbSet<DataProtectionKey> DataProtectionKeys { get; set; } = null!;

并用

缩短行
builder.Services.AddDataProtection().PersistKeysToDbContext<OurDbContext>();

之前

builder.Services.AddDataProtection();

然后数据以加密密码进入数据库。但在这种情况下,5 分钟后,尝试读取此密码将由于过时的密钥而导致异常。

Microsoft 帮助对此没有任何说明:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-6.0#persistkeystodbcontext

简而言之,我尝试将上下文从 PostgresSQL 更改为 MS SQL 和 Sqlite,并且在 Microsoft 在其帮助中推荐的配置下一切都运行良好。