【问题标题】:IDataProtector unable to decrypt when application runs as a service当应用程序作为服务运行时,IDataProtector 无法解密
【发布时间】:2021-06-02 08:39:03
【问题描述】:

我正在使用具有默认 DI 行为的 ASP.NET Core 数据保护。当我的 ASP.NET 应用程序托管在 IIS 上时,这可以正常工作。现在我有一个需要作为服务运行的应用程序。所以我使用 Microsoft.Extensions.Hosting.WindowsServices 来按照我们的标准来做 windows 服务部分

Host.CreateDefaultBuilder(args)
    .UseWindowsService()

BackgroundService 然后使用您的标准托管 ASP.NET Core

var builder = Host.CreateDefaultBuilder()
     .ConfigureAppConfiguration((hostingContext, config) =>
     {
         config.AddJsonFile("secrets.json", optional: true, reloadOnChange: true);
     }
    .ConfigureWebHostDefaults(....)

在后台服务中,我可以解析 IDataProtectionProvider 的一个实例,创建一个保护器,并使用它来解除对我的秘密的保护

var dataProtectionProvider = Container.Resolve<Microsoft.AspNetCore.DataProtection.IDataProtectionProvider>();
var protector = dataProtectionProvider.CreateProtector(appName);
var decryptedSecret = protector.Unprocect(some secret)

现在,只要我从 CLI 运行我的应用程序,一切都可以正常工作。但是将其作为服务运行(相同的文件、相同的位置,当然在相同的帐户下),当我调用 Unprotect 时,我得到一个“无效负载”异常。

我知道相同的路径和相同的帐户很重要,所以已经处理好了。我也知道应用程序可以找到 secrets.json,因为我编写了一些探测代码来检查文件是否存在并且可以在我尝试取消保护之前读取。我什至正在检查我试图取消保护的字符串是否为空/空(不是)。

我终于将调试版本安装为服务并附加了调试器,当我查看 IDataProtectionProvider 时,它有一个目的.. 作为服务运行时,它是 c:\windows\system32。当我的应用程序从 CLI 运行时,它是 exe 的路径。那么,有没有办法自己指定目的,以便无论 CLI/服务如何,事情的行为都是一样的?

那么我该如何控制目的呢?

【问题讨论】:

    标签: c# asp.net-core data-protection


    【解决方案1】:

    因此,在注意到IDataProtectionProvider 的目的不同之后,我已经很好地解决了这个问题。解决方案是设置一个静态目的as explained here

    【讨论】:

    • 您的意思是链接中的答案有用吗?那么为什么不投票呢?或者您的意思只是 question 有帮助(由具有一定知识的提问者提供...)?
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2019-11-19
    相关资源
    最近更新 更多