如何使用OWIN自托管WebApi(.NET Fx4.7.x)配置IdentityServer4?
首先得明确一个核心事实:IdentityServer4是完全基于ASP.NET Core构建的,它不支持.NET Framework下的OWIN自托管模型。这就是你两次尝试都失败的根本原因,下面详细解释并给出可行方案:
为什么你的尝试失败?
尝试1的问题
你看到的app.UseIdentityServer()是ASP.NET Core中IApplicationBuilder的扩展方法,而OWIN自托管里的app是IAppBuilder类型——这两个是完全不同的中间件管道模型,没有直接兼容的方法,所以代码根本无法编译。
尝试2的问题
IdentityServerMiddleware是为ASP.NET Core的RequestDelegate管道设计的,而OWIN使用的是基于HttpMessageHandlerAdapter的处理模型,两者的签名完全不匹配,这就是启动时抛出No conversion available between System.Web.Http.Owin.HttpMessageHandlerAdapter and Microsoft.AspNetCore.Http.RequestDelegate错误的原因。手动注册中间件无法跨越这个模型差异。
可行的解决方案
方案1:迁移到ASP.NET Core(推荐)
虽然你想用.NET Framework 4.7.x,但ASP.NET Core支持以.NET Framework 4.7.x为目标框架,这样你既可以保留.NET Framework的依赖,又能正常使用IdentityServer4:
- 创建一个ASP.NET Core Web应用,在创建时选择目标框架为
.NET Framework 4.7.x; - 添加IdentityServer4的NuGet包:
Install-Package IdentityServer4; - 按照官方文档配置IdentityServer:
- 在
Startup.cs的ConfigureServices方法中注册IdentityServer服务(配置资源、客户端、身份资源等); - 在
Configure方法中调用app.UseIdentityServer();
- 在
- 你可以选择用Kestrel自托管这个ASP.NET Core应用,效果和OWIN自托管类似,但完全兼容IdentityServer4。
方案2:退而使用IdentityServer3(仅当必须保留OWIN自托管时)
如果你的项目必须严格基于OWIN自托管(.NET Framework),那只能选择IdentityServer3——尽管它已经停止维护,但这是唯一支持OWIN模型的IdentityServer版本。不过还是强烈建议优先考虑方案1,因为IdentityServer4会持续更新安全补丁和新特性。
内容的提问来源于stack exchange,提问作者Sayan Pal

