情况
我有一个使用 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/