2014-07-10 25 views
5

SituazionePipeline integrata WCF, WebAPI e OWIN IIS. Skip OWIN basata sulla rotta

Ho un'applicazione Silverlight che utilizza un backend WCF. Andando avanti, ci siamo spostati sui client JS con WebAPI.

Ho un paio di controller WebAPI che vorrei utilizzare dal client Silverlight e li ho quindi caricati all'interno dell'applicazione ASP.Net che ospita i servizi WCF.

Questo funziona bene da un punto di vista "tutti i servizi sono disponibili", tuttavia l'autorizzazione viene invocata più volte per le chiamate WCF; da OWIN e attraverso WCF ServiceAuthorizationManager

Sul lato WCF, mia implementazione ServiceAuthorizationManager convalida il token nel AuthHeader e quindi trasforma quella pedina (nel senso Transformation System.IdentityModel rivendicazioni). Sul lato WebAP sto usando Thinktecture.IdentityModel che fornisce a OWIN Middleware la convalida dei token e la trasformazione delle attestazioni.

Il problema è che il middleware OWIN viene richiamato per tutte le richieste (incluse le richieste WCF). Quindi nel caso di una richiesta WCF ottengo la convalida e la trasformazione eseguite due volte. Non posso semplicemente rimuovere ServiceAuthorizationManager e lasciare che sia il middleware a gestirlo, perché WCF non sa nulla di OWIN e il passaggio finale di ServiceAuthorizationManager è impostare l'entità di contesto dell'operazione (diversa da ClaimsPrincipal.Current).

Domanda

Qualcuno ha avuto un problema come questo prima con WCF e WebAPI seduti fianco a fianco? L'approccio migliore sarebbe in qualche modo abbandonare molto presto la pipeline OWIN per le chiamate alla WCF e, in caso affermativo, come farlo, attraverso un OMC? Oppure posso in qualche modo utilizzare l'approccio di IAppBuilder.Map per registrare solo i componenti di convalida e di trasformazione del token per le rotte API (in questo caso nulla starting/api)?

risposta

2

Sono riuscito a farlo funzionare tramite un 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); 
        }); 

L'unica cosa che mi chiedo è il motivo per IAppBuilder.MapWhen opere come sopra, ma quando uso IAppBuilder.Map non sembra funzionare ...

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

Se qualcuno può spiegare perché la versione 'app.Mapp' non funziona sarebbe molto apprezzata? –

+0

Ho lo stesso problema: MapWhen con un predicato di corrispondenza esplicita funziona mentre Mappa non lo fa. –

0

Un grande grazie alla risposta di cui sopra. Con questo pezzo di codice, sono stato in grado di capire come instradare condizionalmente le chiamate in modo che le chiamate WCF non vengano afferrate dal middleware del contenuto statico.

//app.UseMiddleware<ServeStaticFilesMiddleware>(); 

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