会话状态 Cookie 的存在导致应用程序崩溃

Presence of Session State Cookie causes app to crash

我有一个使用 Umbraco 配置的会话状态的 Umbraco 9.4.3 站点 (.NET5.0)。应用程序正常启动,然后在控制器方法中将值写入会话状态,这会导致创建会话 cookie。

public override IActionResult Index()
{
    HttpContext.Session.SetString("test", "abc");
    return ...;
}

虽然该 cookie 存在,但对该网站的任何后续请求都会导致其崩溃。 Umbraco 日志中的最后一个条目如下:

{
    "@t": "2022-05-19T08:23:40.7534511Z",
    "@mt": "Performing unprotect operation to key {KeyId:B} with purposes {Purposes}.",
    "@r": [
        "{c3e6bbb0-206d-4708-a9ab-ddfbfc117976}"
    ],
    "@l": "Verbose",
    "KeyId": "c3e6bbb0-206d-4708-a9ab-ddfbfc117976",
    "Purposes": "('C:\src\websites-myapp-umbraco\MyApp.Umbraco.Web', 'SessionMiddleware')",
    "EventId": {
        "Id": 5,
        "Name": "PerformingUnprotectOperationToKeyWithPurposes"
    },
    "SourceContext": "Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector",
    "RequestId": "8000000e-0000-f800-b63f-84710c7967bb",
    "RequestPath": "/",
    "ProcessId": 28188,
    "ProcessName": "iisexpress",
    "ThreadId": 16,
    "AppDomainId": 1,
    "AppDomainAppId": "88a8c25dd56eba55a0d1e3793780cc946fd9e0fd",
    "MachineName": "IT08761",
    "Log4NetLevel": "ALL  ",
    "HttpRequestId": "2f3fb967-5aeb-4b13-adb6-12bb6ed89218",
    "HttpRequestNumber": 2,
    "HttpSessionId": "0"
}

这表明 SessionMiddleware 由于某种原因未能解密会话 cookie,即使它之前已成功加密会话 ID 值。

我使用 Umbraco VS 项目模板创建了一个干净的站点,该模板以与有问题的应用程序相同的方式配置其管道,并尝试重现其中的错误,但没有成功。我比较了这两个站点,从代码和配置的角度来看,它们基本相同。肯定是有区别的,但是我看不出来

任何人都可以对此有所了解吗?是否存在导致失败的加密密钥丢失或无法访问?

事实证明,缺少 Serilog 配置是此错误的根本原因。将以下内容添加到 appsettings.json 解决了问题:

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "System": "Warning"
    }
  }
}