WCF,WebAPI和OWIN IIS集成管道.根据路线跳过OWIN

Sim*_*Fox 5 asp.net wcf authorization asp.net-web-api owin

情况

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

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

从"所有服务都可用"的角度来看,这样可以正常工作,但是WCF调用会多次调用授权; 从OWIN到WCFServiceAuthorizationManager

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

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

在WCF和WebAPI并排坐着之前,有没有人遇到这样的问题?最好的方法是在WCF调用的早期以某种方式退出OWIN管道,如果是这样,如何通过OMC完成?或者我可以以某种方式使用IAppBuilder.Map方法仅注册API路由的令牌验证和转换组件(在这种情况下,任何启动/ api)?

Sim*_*Fox 3

我已经设法通过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);
                    });
Run Code Online (Sandbox Code Playgroud)

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

app.Map("/api",
        subApp => ...
Run Code Online (Sandbox Code Playgroud)