ASP.NET Core 2.1项目安装运行Microsoft.Identity.Web报错咨询
我手头有多个ASP.NET Core 2.1 API项目,这类项目需要引用面向.NET 4.7.2的DLL,应用采用Azure AD作为身份验证方案。近期我花费数小时尝试将身份验证库升级为Microsoft.Identity.Web,但始终未能成功。该库依赖Microsoft.Extensions.* 5.0及以上版本,会导致Kestrel在启动后立即抛出如下错误:
System.TypeLoadException: Could not load type 'Microsoft.Extensions.Primitives.InplaceStringBuilder' from assembly 'Microsoft.Extensions.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
at Microsoft.Net.Http.Headers.DateTimeFormatter.ToRfc1123String(DateTimeOffset dateTime, Boolean quoted)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.DateHeaderValueManager.SetDateValues(DateTimeOffset value)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.CreateServiceContext(IOptions1 options, ILoggerFactory loggerFactory) at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer..ctor(IOptions1 options, ITransportFactory transportFactory, ILoggerFactory loggerFactory)
问题原因是Microsoft.Extensions.Primitives升级到5.0版本后移除了Kestrel运行所需的方法,请问有没有可行的解决方法?
补充说明(2021年10月13日)
由于Microsoft.Extensions.Primitives不是显式安装的,因此不会出现在Nuget包列表中,无法直接降级。如果我尝试显式安装2.1.6等旧版本,会收到如下错误提示:
NU1605: Detected package downgrade: Microsoft.Extensions.Primitives from 5.0.0 to 2.1.6. Reference the package directly from the project to select a different version. test21 -> Microsoft.Identity.Web 1.18.0 -> Microsoft.Extensions.Caching.Memory 5.0.0 -> Microsoft.Extensions.Primitives (>= 5.0.0) test21 -> Microsoft.Extensions.Primitives (>= 2.1.6)
可行解决方案按优先级排序如下:
1. 使用对应版本的原生Azure AD认证库(最推荐,生产环境可用)
ASP.NET Core 2.1 本身有官方适配的Azure AD认证库,直接安装Microsoft.AspNetCore.Authentication.AzureAD.UI的2.1.x版本即可,该库完全兼容.NET 4.7.2运行时和当前项目的所有Microsoft.Extensions.*依赖,不会出现版本冲突,功能上完全覆盖基础的Azure AD身份验证、授权需求。
配置方式和Microsoft.Identity.Web类似,只需在Startup.cs的ConfigureServices方法中添加对应服务,配置Azure AD的租户、客户端ID等参数即可正常使用。
2. 升级项目框架(适合可以调整依赖的场景)
如果你的项目引用的.NET 4.7.2 DLL可以替换为.NET Standard兼容版本,可直接将整个项目升级到.NET 6/LTS版本,配合最新版的Microsoft.Identity.Web使用,所有依赖版本完全匹配,不会出现冲突问题。
注意:ASP.NET Core 3.0及以上版本不再支持运行在.NET Framework上,如果你必须保留.NET 4.7.2的依赖,无法使用该方案。
3. 强制压制降级警告(临时测试用,不推荐生产环境)
如果必须在现有框架下临时测试Microsoft.Identity.Web的功能,可以在项目文件(.csproj)中添加配置压制NU1605警告,同时显式引用2.1.6版本的Microsoft.Extensions.Primitives:
<PackageReference Include="Microsoft.Extensions.Primitives" Version="2.1.6" /> <NoWarn>NU1605</NoWarn>
如果你的项目目标是.NET Framework 4.7.2,还可以在app.config中添加绑定重定向,强制所有程序集调用2.1.6版本的Microsoft.Extensions.Primitives。
该方案存在不可预知的运行时风险,可能出现其他API不兼容的报错,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者yosh

