为什么会出现此 DataProtectionProvider 错误

Why this DataProtectionProvider Error Occurs

我正在使用 DataProtectionProvider class 测试配置数据保护。测试代码以一种方式工作,但以另一种方式失败。

测试环境:

应用程序类型:ASP.NET 6 控制台应用程序与 c# 包:Microsoft.AspNetCore.DataProtection.Extensions 6.0.3 IDE:VS 2022 测试项目:ProtectData

问题描述:

在 DataProtector class 中有 3 个方法(参见测试代码 #1)。

  1. TestProtector 方法用于初始测试。它以相同的方法加密和解密数据。没有任何问题

  2. 在 EncryptData 和 DecryptData 方法中,该过程分为 2 个独立的步骤。 运行ning用这些方法测试时,异常出现在语句的DecryptData方法:decrypted = protector.Unprotect(encryptedData);异常信息显示在以下屏幕截图中。

  3. 测试是 运行 使用 program.main 方法(参见测试代码 $2)

问题:

将“TestProtector”方法中的代码与这两种方法中的代码进行比较时,它们都以相同的方式使用相同的键处理过程。为什么一种方法完美,而“两步法”总是失败?这真的让我很困惑。我将不胜感激任何有关故障排除的帮助或建议。

测试代码

---- 测试代码 #1(使用 DataProtectionProvider 的控制台应用程序)

using Microsoft.AspNetCore.DataProtection;
using System;

namespace ProtectData
{
    public static class DataProtector
    {
        public static string EncryptData(string inputText)
        {
            string encrypted = string.Empty;
            try
            {
                var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");

                var protector = dataProtectionProvider.CreateProtector("protect data");

                //var protectedPayload = protector.Protect(inputText);
                encrypted = protector.Protect(inputText);

            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
            }

            return encrypted;
        }

        public static string DecryptData(string encryptedData)
        {
            string decrypted = string.Empty;

            try
            {
                var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");
                var protector = dataProtectionProvider.CreateProtector("protect conn string");
                decrypted = protector.Unprotect(encryptedData);
            }
            catch(Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message, ex);
            }

            return decrypted;
        }

        public static void TestProtector()
        {
            string inputText = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
            Console.WriteLine($"inputText:\n{inputText}\n");

            string encrypted = string.Empty;
            string decrypted = string.Empty;

            try
            {
                // encrypt given string
                var dataProtectionProvider = DataProtectionProvider.Create($".\appconfig.txt");

                var protector = dataProtectionProvider.CreateProtector("protect data");

                //generate protected payload for input text
                encrypted = protector.Protect(inputText);
                Console.WriteLine($"protectedPayload:\n{encrypted}\n");

                //decrypt protected data
                decrypted = protector.Unprotect(encrypted);
                Console.WriteLine($"UnprotectPayload:\n{decrypted}\n");

                //show verification result
                Console.WriteLine($"Verify result:\n{(inputText == decrypted ? true : false)}");
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error:", ex);
            }
        }
    }
}

---- 测试代码#2(程序主程序)

namespace ProtectData
{
    public class Program
    {
        static void Main()
        {
            string testType = "two_step";
            RunTest(testType);

            Console.WriteLine();
            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }

        static void RunTest(string testType)
        {
            switch ( testType.ToLower())
            {
                case "simple":
                    DataProtector.TestProtector();
                    break;

                case "two_step":
                    string inputData = "DataSource=localhost, database=testdb, userID=appuser, password=topsecret";
                    Console.WriteLine($"inputData:\n{inputData}\n");

                    string protectedData = DataProtector.EncryptData(inputData);
                    Console.WriteLine($"protectedData:\n{protectedData}\n");

                    string outputData = DataProtector.DecryptData(protectedData);
                    Console.WriteLine($"outputData:\n{outputData}\n");

                    bool verify = inputData == outputData;
                    Console.WriteLine($"verified: {verify}");
                    break;
            }
        }
    }
}

我能够使用以下在线文档中提供的示例解决问题:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/non-di-scenarios?view=aspnetcore-6.0