ASP.NET Core Web API启用Session触发CryptographicException异常求助
问题描述
为ASP.NET Core Web API项目添加Session功能,配置如下:
服务注册代码
builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); });
中间件配置代码
app.UseAuthentication(); app.UseAuthorization(); app.UseSession();
调用任意API时(即使未使用Session),抛出如下异常:
System.Security.Cryptography.CryptographicException: 尝试加密提供的数据时出错。有关详细信息,请参阅内部异常。更多信息请访问http://aka.ms/dataprotectionwarning
---> System.MissingMethodException: 未找到方法: 'Boolean Microsoft.AspNetCore.Cryptography.UnsafeNativeMethods.CryptProtectData(Microsoft.AspNetCore.Cryptography.DATA_BLOB*, IntPtr, Microsoft.AspNetCore.Cryptography.DATA_BLOB*, IntPtr, IntPtr, UInt32, Microsoft.AspNetCore.Cryptography.DATA_BLOB ByRef)'.
解决方案
1. 统一ASP.NET Core相关NuGet包与SDK版本
这个异常核心原因是版本不兼容:项目中引用的Microsoft.AspNetCore系列NuGet包版本,与目标框架的SDK版本不一致,导致底层方法签名不匹配。
- 打开项目的
.csproj文件,检查所有PackageReference中以Microsoft.AspNetCore.开头的包(比如Microsoft.AspNetCore.Session、Microsoft.AspNetCore.DataProtection等),确保版本号与<TargetFramework>指定的框架版本完全匹配。例如目标框架是net6.0,则所有相关包版本应为6.x.x;若为net7.0,则版本应为7.x.x。 - 执行
dotnet restore重新还原依赖。
2. 清理项目缓存并重新生成
旧编译缓存可能残留不兼容的dll,引发异常:
- 删除项目目录下的
bin和obj文件夹; - 在终端执行:
dotnet clean dotnet build
3. 手动配置DataProtection密钥存储(Windows环境适配)
Windows环境下,DataProtection默认使用系统加密API存储密钥,可能因权限或环境配置问题导致异常。可手动指定密钥存储路径:
在Program.cs的服务注册阶段添加:
builder.Services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo(@"C:\your-key-storage-path"));
(替换C:\your-key-storage-path为实际存在的本地目录,确保应用具备该目录的读写权限)
4. 确认运行环境的.NET Runtime版本
确保运行项目的环境中,安装了与项目目标框架完全匹配的.NET Runtime版本,避免用不兼容的Runtime运行项目。
内容的提问来源于stack exchange,提问作者Muhammet İkbal

