【问题标题】:WCF, WebAPI and OWIN IIS integrated pipeline. Skip OWIN based on routeWCF、WebAPI 和 OWIN IIS 集成管道。根据路由跳过 OWIN
【发布时间】:2014-08-31 04:52:48
【问题描述】:

情况

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

我想从 Silverlight 客户端使用几个 WebAPI 控制器,因此将它们加载到托管 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 开头的)?

【问题讨论】:

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


    【解决方案1】:

    我已经设法通过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 => ...
    

    【讨论】:

    • 如果有人能解释为什么app.Mapp 版本不起作用,将不胜感激?
    • 我也有同样的问题:带有显式匹配谓词的 MapWhen 有效,而 Map 无效。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多