ASP.Net项目加载本地Nuget包提示强名称签名验证失败怎么办
本地构建Nuget包强名称签名报错修复方案
根因说明
官方源发布的对应包带合法强名称签名,你本地构建的版本要么未开启签名、要么使用了延迟签名未补全私钥、要么签名密钥与官方版本不一致,导致CLR运行时校验强名称不通过。
方案1:配置正确的强名称签名(推荐)
- 如果你是该Nuget包的维护者,找到官方发布使用的
.snk强名称密钥文件,存放到包项目根目录 - 编辑包项目的
.csproj文件,新增签名配置:
<PropertyGroup> <!-- 开启程序集签名 --> <SignAssembly>true</SignAssembly> <!-- 指定密钥文件路径 --> <AssemblyOriginatorKeyFile>你的密钥文件名称.snk</AssemblyOriginatorKeyFile> <!-- 关闭延迟签名 --> <DelaySign>false</DelaySign> </PropertyGroup>
- 若必须使用延迟签名,构建完成后需用SDK自带的
sn.exe工具补全签名,执行命令:sn -R 生成的程序集路径.dll 你的私钥文件路径.snk - 重新打包生成Nuget包,卸载项目中原有的旧包后重新引入新包即可。
方案2:临时关闭强名称验证(仅本地调试使用,禁止上生产)
如果你无法获取官方签名密钥,仅需要本地调试修改后的包,可以单独为该程序集开强名称验证豁免:
- 以管理员身份打开Visual Studio开发者命令提示符
- 64位系统需分别针对32位、64位运行时添加豁免,执行命令:
:: 替换为实际的程序集名称 sn -Vr *,你的程序集名称 :: 若需指定公钥令牌,可先执行sn -T 你的程序集.dll查询公钥令牌后执行 sn -Vr *,你的程序集名称,PublicKeyToken=查询到的公钥令牌
- 重启本地站点对应的IIS Express/Kestrel服务即可生效
- 调试完成后可执行
sn -Vu *,你的程序集名称移除豁免规则,规避安全风险
注意事项
- 强名称验证是.NET运行时的安全校验机制,生产环境禁止关闭验证,务必使用官方签名的合法包
- 若为第三方开源包,建议将你的修改提交到官方仓库,使用官方构建的发布版本,避免自行构建带来的签名兼容问题
内容的提问来源于stack exchange,提问作者Slava Podolskiy
相关产品推荐
相关产品推荐

