引入rsk.identityserver4.saml后AddIdentityServer调用歧义报错如何解决
问题根因
出现CS0121错误是因为你引入的
rsk.identityserver4.saml包同时携带了旧版IdentityServer4和新版Duende IdentityServer两类依赖,两个同名扩展方法AddIdentityServer分别接收不同命名空间下的Options参数,编译器无法自动判断你要调用的重载版本。
解决方法
- 方案1:显式指定参数类型(改动最小,优先推荐)
直接在委托的参数位置显式声明你实际需要的Options命名空间,告诉编译器要匹配哪个重载:
如果你的项目原本用的是IdentityServer4,代码改为:
var builder = services.AddIdentityServer((IdentityServer4.Configuration.IdentityServerOptions options) => { options.Events.RaiseErrorEvents = true; options.Events.RaiseInformationEvents = true; options.Events.RaiseFailureEvents = true; options.Events.RaiseSuccessEvents = true; options.EmitStaticAudienceClaim = true; })
如果你的项目已经迁移到Duende IdentityServer,就将参数类型替换为Duende.IdentityServer.Configuration.IdentityServerOptions即可。
- 方案2:排除不需要的依赖包
如果你确定项目只会用到其中一个版本的IdentityServer,可以在项目的.csproj文件中,给rsk.identityserver4.saml的引用配置排除不需要的版本依赖,避免冲突加载。比如你用的是IdentityServer4,配置如下:
<PackageReference Include="rsk.identityserver4.saml" Version="你当前使用的包版本号"> <ExcludeAssets>compile</ExcludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>
- 方案3:为冲突程序集设置外部别名
如果特殊场景下你需要同时用到两个版本的IdentityServer相关逻辑,可以给两个冲突的IdentityServerServiceCollectionExtensions所在的程序集设置不同的外部别名,调用时通过别名区分具体要使用的方法,该方案改动复杂度较高,非必要不推荐。
内容的提问来源于stack exchange,提问作者M Usama Alvi
相关产品推荐
相关产品推荐

