asp.net - WCF、WebAPI 和 OWIN IIS 集成管道。根据路线跳过OWIN

标签 asp.net wcf asp.net-web-api authorization owin

情况

我有一个使用 WCF 后端的 Silverlight 应用程序。展望 future ,我们已转向使用 WebAPI 的 JS 客户端。

我想从 Silverlight 客户端使用几个 WebAPI Controller ,因此将它们加载到托管 WCF 服务的 ASP.Net 应用程序中。

从“所有服务都可用”的角度来看,这工作得很好,但是 WCF 调用会多次调用授权;来自 OWIN 并通过 WCF ServiceAuthorizationManager

在 WCF 方面,我的 ServiceAuthorizationManager 实现验证 AuthHeader 中的 token ,然后转换该 token (在 System.IdentityModel 声明转换意义上)。在 WebAPI 方面,我使用 Thinktecture.IdentityModel它提供了 OWIN 中间件来进行 token 验证和声明转换。

问题是,所有请求(包括 WCF 请求)都会调用 OWIN 中间件。因此,在 WCF 请求的情况下,我会执行两次验证和转换。我不能只删除 ServiceAuthorizationManager 并让中间件处理它,因为 WCF 对 OWIN 一无所知,而 ServiceAuthorizationManager 的最后一步是设置操作上下文主体(与 ClaimsPrincipal.Current 不同)。

问题

以前有人在 WCF 和 WebAPI 并存时遇到过这样的问题吗?最好的方法是否是以某种方式尽早退出 WCF 调用的 OWIN 管道,如果是这样,如何通过 OMC 来完成?或者我可以以某种方式使用 IAppBuilder.Map 方法仅注册 API 路由的 token 验证和转换组件(在本例中以/api 开头)?

最佳答案

我已经设法通过 Branched Pipeline 让它工作.

app.MapWhen(c => c.Request.Path.Value.Contains("/api"),
                    subApp =>
                    {
                        subApp.UseJsonWebToken(
                            issuer: clientDetails.Issuer,
                            audience: clientDetails.Audience,
                            signingKey: clientDetails.SigningKey);

                        subApp.UseClaimsTransformation(transformer.Transform);

                        var webApiConfig = WebApiConfig.Configure();
                        webApiConfig.DependencyResolver = StructureMapConfig.HttpDependencyResolver();
                        subApp.UseWebApi(webApiConfig);
                    });

我唯一想知道的是为什么上面的 IAppBuilder.MapWhen 有效,但是当我使用 IAppBuilder.Map 时它似乎不起作用......

app.Map("/api",
        subApp => ...

关于asp.net - WCF、WebAPI 和 OWIN IIS 集成管道。根据路线跳过OWIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665953/

相关文章:

c# - 测试 asp.net 项目 IHttpHandler , Request.Files 问题

c# - 从 WCF 服务返回实体时从实体中剥离字段

.NET - 部署 WCF 客户端,没有 app.config

.net - 将 .NET Core 应用程序部署为 Docker 化容器的好处?

c# - 如何在ASP.NET 5 Web API和Entity Framework 7中设置 Multi-Tenancy ?

没有带数据库事务或 TransactionScope 的 EF 的 C# UnitOWork 实现

c# - ASP.NET MVC 自定义多字段验证

asp.net - 调用 COM 组件时返回了错误 HRESULT E_FAIL

c# - 如何在企业架构师中使用 C# 创建状态机图?

具有消息安全性的 WCF 路由