2014-07-10 22 views
5

情况WCF,WebAPI和OWIN IIS集成管道。跳过基于路线的OWIN

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

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

从“所有服务都可用”的角度来看,这可以正常工作,但是对于WCF调用,将多次调用授权;从OWIN和通过WCF ServiceAuthorizationManager

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

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

问题

有没有人有这样的问题之前,WCF和的WebAPI并肩而坐?最好的办法是在WCF调用的很早之前以某种方式退出OWIN管道,如果可以的话,通过OMC如何做到这一点?或者我可以以某种方式使用IAppBuilder.Map方法仅注册API路径的标记验证和转换组件(在这种情况下,任何启动/ api)?

回答

2

我设法让它通过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 => ... 
+0

如果有人可以解释为什么'app.Mapp'版本不起作用,将不胜感激? –

+0

我有同样的问题:MapWhen与显式匹配谓词工作,而Map没有。 –

0

非常感谢答案的上方。通过这段代码,我能够弄清楚如何有条件地路由呼叫,以便WCF呼叫不被静态内容中间件占用。

//app.UseMiddleware<ServeStaticFilesMiddleware>(); 

    app.MapWhen(c => !c.Request.Path.Value.Contains(".svc"), 
      subApp => 
      { 
       subApp.UseMiddleware<ServeStaticFilesMiddleware>(); 
      });