创建一个 IDataProtectionProvider asp.net core 的实例

use*_*946 7 c# asp.net-mvc asp.net-core

我正在尝试创建一个静态类和方法来加密和解密 asp.net 核心中的数据。

但问题是我必须使用 DI 在构造函数中获取“IDataProtectionProvider 提供者”,然后将其传递给方法以便使用 CreateProtector。

我不希望那样,直接想在它自己的方法中实例化 IDataProtectionProvider 提供者。

控制器代码:

private readonly IDataProtectionProvider _provider;
public addMDL(IDataProtectionProvider provider)
{
    _provider = provider;
}

public IActionResult OnGet()
{
    DataProProvider.decData(0, "ABC", _provider)
}
Run Code Online (Sandbox Code Playgroud)

静态类是:

public static class DataProProvider
{

    public static string encData(int intData, string strData, IDataProtectionProvider provider)
    {
        string str;
        IDataProtector dataProtector;
        dataProtector = provider.CreateProtector("AA");
        if (!string.IsNullOrEmpty(strData))
        {
            str = dataProtector.Protect(strData);
        }
        else
        {
            str = dataProtector.Protect(intData.ToString());
        }
        return str;
    }

    public static string decData(int intData, string strData, IDataProtectionProvider provider)
    {
        string str;
        IDataProtector dataProtector;
        dataProtector = provider.CreateProtector("A3");
        if (!string.IsNullOrEmpty(strData))
        {
            str = dataProtector.Unprotect(strData);
        }
        else
        {
            str = dataProtector.Unprotect(intData.ToString());
        }
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

[更新]

根据建议,我已使用C# 中的 Encrypting & Decrypting a String 移至更简单的方法,请此处输入链接描述

zer*_*ius 6

您可以参考 Microsoft 关于如何将数据保护用于非 DI 解决方案的建议 ( https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/non-di-scenarios ?view=aspnetcore-2.2)。

简而言之,DataProtectionProvider.Create()为此使用静态方法:

using Microsoft.AspNetCore.DataProtection;
static class Program
{
    static void Main()
    {
        var dataProtectionProvider = DataProtectionProvider.Create("Test App");
        var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
        var plainText = "ABCDEFGH";
        var protectedText = protector.Protect(plainText);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*mon 4

浏览源代码似乎只能通过一些反射黑客或代码复制来实例化没有 DI 的IDataProtectionProvider

查看此代码,您可以看到为 DI 容器中的各种接口注册了哪些实现。例如, IDataProtectionProvider的实现是KeyRingBasedDataProtectionProvider。现在检查该类的源代码。它是内部的,因此您无法在声明程序集之外实例化它(没有反射)。经过更多挖掘后,发现提供程序创建了KeyRingBasedDataProtector实例,该实例也被声明为内部实例。

所有这些都表明 DataProtection API 不适合在没有 DI 容器的情况下使用。您应该重新考虑您是否真的想以这种方式使用它。

  • 还值得注意的是,数据保护 API 不适用于长期存储。来自 https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/limited-lifetime-payloads?view=aspnetcore-2.1 “不建议使用这些 API 来保护需要长期或无限期持久性的有效负载。“我可以承受受保护的有效负载在一个月后永久无法恢复吗?” 可以作为一个很好的经验法则;如果答案是否定的,那么开发人员应该考虑替代 API。” 对于OP来说这可能不是问题,但值得注意。 (5认同)
  • @ErikPhilips 已修复。我希望 MS 最终停止移动他们的存储库...... (2认同)