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 移至更简单的方法,请在此处输入链接描述
您可以参考 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)
浏览源代码似乎只能通过一些反射黑客或代码复制来实例化没有 DI 的IDataProtectionProvider。
查看此代码,您可以看到为 DI 容器中的各种接口注册了哪些实现。例如, IDataProtectionProvider的实现是KeyRingBasedDataProtectionProvider。现在检查该类的源代码。它是内部的,因此您无法在声明程序集之外实例化它(没有反射)。经过更多挖掘后,发现提供程序创建了KeyRingBasedDataProtector实例,该实例也被声明为内部实例。
所有这些都表明 DataProtection API 不适合在没有 DI 容器的情况下使用。您应该重新考虑您是否真的想以这种方式使用它。
| 归档时间: |
|
| 查看次数: |
6700 次 |
| 最近记录: |