Come rendere l’autenticazione CORS in WebAPI 2?

Lo scenario è semplice, ho bisogno di accedere da un altro server (diverso dal server API) per recuperare il token di accesso.

Ho installato il pacchetto Microsoft.Owin.Cors sul server API. Nel file Startup.Auth.cs , sotto public void ConfigureAuth(IAppBuilder app) , ho aggiunto in

 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

In WebApiConfig.cs , sotto public static void Register(HttpConfiguration config) , ho aggiunto in queste righe:

 // Cors var cors = new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS"); config.EnableCors(cors); 

Cos’altro dovrei cambiare?

Guarda cosa ho trovato!

Aggiungi alcune intestazioni personalizzate all’interno di .

       

Quindi posso eseguire l’autenticazione CORS.

Ho avuto molti tentativi ed errori per configurarlo per il client web basato su AngularJS.
Per quanto mi riguarda, approcci di seguito funziona con ASP.NET WebApi 2.2 e il servizio basato su OAuth.

  1. Installa il pacchetto nuget di Microsoft.AspNet.WebApi.Cors .
  2. Installa il pacchetto nuget di Microsoft.Owin.Cors .
  3. Aggiungi config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE")); a quanto sopra di WebApiConfig.Register(config); linea nel file Startup.cs .
  4. Aggiungi app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); al file Startup.Auth.cs . Questo deve essere fatto prima di chiamare IAppBuilder.UseWebApi
  5. Rimuovi eventuali impostazioni xml cosa ha fatto Blaise.

Ho trovato molte variazioni e combinazioni di setup qui stackoverflow o articoli del blog . Quindi, l’approccio di Blaise potrebbe essere o non essere sbagliato. Sono solo altre impostazioni che penso.

Dopo molte ore di ricerca e guardando molte molte diverse soluzioni a questo sono riuscito a farlo funzionare come da sotto.

Ci sono una serie di motivi per cui questo sta accadendo. Molto probabilmente hai CORS abilitato nel posto sbagliato o è abilitato due volte o per niente.

Se si utilizza l’API Web e l’endpoint Owin Token, è necessario rimuovere tutti i riferimenti a CORS nel proprio metodo API Web e aggiungere il metodo owin corretto poiché web api cors non funzionerà con l’endpoint Token mentre Owin cors funzionerà per entrambi i Web. Gli endpoint di autenticazione API e token consentono quindi di iniziare:

  1. Assicurati di aver installato il pacchetto Owin Cors Rimuovi qualsiasi linea che hai eg.config.EnableCors (); dal tuo file WebAPIconfig.cs

  2. Vai al tuo file startup.cs e assicurati di eseguire Owin Cors prima di qualsiasi altra esecuzione della configurazione.

    app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); ConfigureAuth (app);

  3. Se hai ancora problemi vai su Startup.Auth.cs e assicurati di avere il seguente nel tuo metodo ConfigureAuth (non dovresti averne bisogno se il tuo file startup.cs è corretto)

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

web.config

      

Startup.cs

 var appSettings = WebConfigurationManager.AppSettings; // If CORS settings are present in Web.config if (!string.IsNullOrWhiteSpace(appSettings["cors:Origins"])) { // Load CORS settings from Web.config var corsPolicy = new EnableCorsAttribute( appSettings["cors:Origins"], appSettings["cors:Headers"], appSettings["cors:Methods"]); // Enable CORS for ASP.NET Identity app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = request => request.Path.Value == "/token" ? corsPolicy.GetCorsPolicyAsync(null, CancellationToken.None) : Task.FromResult(null) } }); // Enable CORS for Web API config.EnableCors(corsPolicy); } 

Nota : è necessario app.UserCors(...) prima di configurare l’id quadro ASP.NET.

Origine: Web Starter Kit di applicazioni Web ASP.NET (API Web ASP.NET, Identity framework, SignalR)

Per approfondire la risposta di Youngjae, c’è un ottimo tutorial su come configurare OWIN con Web API e abilitare CORS nel processo su http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web- api-2-Owin-asp-net-id quadro /

Dovrai aggiungere il pacchetto NuGet per CORS con il comando:
Install-Package Microsoft.Owin.Cors -Version 2.1.0

Poi aggiungi
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

al tuo metodo di configurazione in Startup.cs in modo che assomigli a qualcosa:

 public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); ConfigureOAuth(app); WebApiConfig.Register(config); app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); app.UseWebApi(config); } 

La risposta per me è stata trovata a

Web Api 2 Verifica preliminare richiesta CORS per token bearer

Nello specifico, la richiesta / Token che utilizza un’implementazione di OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials stava aggiungendo nuovamente l’intestazione. Aggiungi la roba OWIN CORS prima di qualsiasi altra configurazione OWIN e rimuovi l’intestazione da GrantResourceOwnerCredentials, come da quel collegamento e voilà. In bocca al lupo.

Voglio solo condividere la mia esperienza. Ho passato metà della giornata a sbattere la testa e cercare di farlo funzionare. Ho letto numerosi articoli e domande SO e alla fine ho capito cosa c’era che non andava.

La linea

 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

non era il primo nel metodo di Configuration class di Startup . Quando l’ho spostato verso l’alto, tutto ha iniziato a funzionare magicamente.

E nessuna intestazione personalizzata in web.config o config.EnableCors(corsPolicy); o qualsiasi altra cosa era necessaria.

Spero che questo aiuti qualcuno a risparmiare un po ‘di tempo.

Puoi trovare qui i molteplici modi in cui devi abilitare CORS in diversi ambiti: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

Ad ogni modo ho avuto lo stesso problema e aggiungendo le intestazioni in modi diversi non ho ottenuto la soluzione completa.

Ho scoperto che IIS utilizza gestori che annullano la configurazione della tua app Web CORS se non si specifica il contrario.

Nel mio caso, ho anche dovuto rimuovere l’utilizzo dei gestori IIS aggiungendo la seguente configurazione sul Web.config principale della mia applicazione:

         

Si tenga presente che questa configurazione può essere impostata di default quando si crea un nuovo progetto a seconda del tipo di esso, ma se si inizia da zero probabilmente si dovrà aggiungere questa configurazione.

L’aggiunta di intestazioni cliente potrebbe non offrirti la massima libertà di personalizzare le esigenze di sicurezza. Apre tutte le altre parti della API al mondo. Il seguente codice lo fa solo per “token”, e il controller un’altra parte di api dovrebbe essere fatto tramite l’annotazione di EableCors.

 public void ConfigureAuth(IAppBuilder app) { //other stuff app.Use(async (context, next) => { IOwinRequest req = context.Request; IOwinResponse res = context.Response; if (req.Path.StartsWithSegments(new PathString("/Token"))) { var origin = req.Headers.Get("Origin"); if (!string.IsNullOrEmpty(origin)) { res.Headers.Set("Access-Control-Allow-Origin", origin); } if (req.Method == "OPTIONS") { res.StatusCode = 200; res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Methods", "GET", "POST"); res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Headers", "authorization", "content-type"); return; } } await next(); }); //other stuff } 

Per abilitare Cors, segui le istruzioni qui .

Quando si utilizza il middleware OWIN per gestire CORS, non è necessario aggiungere intestazioni sul WebAPIConfig o sul file web.config. Sì, l’aggiunta delle intestazioni sul file web.config funziona quando si desidera l’accesso pubblico, ma se è necessario limitare l’accesso in base a una whitelist (domini), consentire l’accesso a Tutti non è più ciò che si vorrebbe fare.

Con OWINS, possiamo gestirlo implementando questo gestore:

 OAuthAuthorizationServerProvider.MatchEndpoint 

Con questo gestore, possiamo rilevare il metodo di richiesta (OPZIONI, POST …) e se la richiesta deve essere considerata come un endpoint Authorize o Token. Questa è l’area in cui è ansible aggiungere la logica per controllare l’intestazione Origin (richiesta) e convalidare se questo dominio dovrebbe essere consentito aggiungendo l’intestazione di risposta Access-Control-Allow-Origin.

 string origin = context.Request.Headers.Get("Origin"); var found = IsDomainAllowed(origin); if (found){ context.Response.Headers.Add("Access-Control-Allow-Origin", new string[] { origin }); } 

Per ulteriori informazioni su questo, guarda questo link: http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html

Soluzione completa. Hai solo bisogno di cambiare alcuni file, funziona per me.

Global.ascx

 public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { WebApiConfig.Register(GlobalConfiguration.Configuration); } } 

WebApiConfig.cs

Tutta la richiesta ha chiamato questo codice.

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { EnableCrossSiteRequests(config); AddRoutes(config); } private static void AddRoutes(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "Default", routeTemplate: "api/{controller}/" ); } private static void EnableCrossSiteRequests(HttpConfiguration config) { var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors); } } 

Qualche controller

Niente da cambiare.

web.config

Hai bisogno di aggiungere gestori in te web.config