会话状态 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"
}
}
}
我有一个使用 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"
}
}
}