Comment faire l’authentification CORS dans WebAPI 2?

Le scénario est simple, je dois me connecter depuis un autre serveur (différent du serveur API) pour récupérer le jeton d’access.

J’ai installé Microsoft.Owin.Cors package Microsoft.Owin.Cors sur le serveur API. Dans le fichier Startup.Auth.cs , sous public void ConfigureAuth(IAppBuilder app) , j’ai ajouté

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

Dans WebApiConfig.cs , sous public static void Register(HttpConfiguration config) , j’ai ajouté les lignes suivantes:

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

Que dois-je changer d’autre?

Regardez ce que j’ai trouvé!

Ajoutez des en-têtes personnalisés à l’intérieur de .

       

Ensuite, je peux faire l’authentification CORS.

J’ai eu beaucoup d’essais et d’erreurs pour le configurer pour le client Web basé sur AngularJS.
Pour moi, les approches ci-dessous fonctionnent avec les services ASP.NET WebApi 2.2 et OAuth.

  1. Installez Microsoft.AspNet.WebApi.Cors package nuget Microsoft.AspNet.WebApi.Cors .
  2. Installez Microsoft.Owin.Cors package nuget Microsoft.Owin.Cors .
  3. Ajouter config.EnableCors(new EnableCorsAtsortingbute("*", "*", "GET, POST, OPTIONS, PUT, DELETE")); au dessus de WebApiConfig.Register(config); ligne au fichier Startup.cs .
  4. Ajouter app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); au fichier Startup.Auth.cs . Cela doit être fait avant d’appeler IAppBuilder.UseWebApi
  5. Supprimez tous les parameters XML de Blaise.

J’ai trouvé de nombreuses variantes et combinaisons de configurations ici emstackrflow ou articles de blog . Ainsi, l’approche de Blaise peut ou non être erronée. C’est juste un autre paramètre je pense.

Après plusieurs heures de recherche et de nombreuses solutions différentes, j’ai réussi à obtenir ce résultat, comme indiqué ci-dessous.

Il y a plusieurs raisons à cela. Il est fort probable que CORS soit activé au mauvais endroit ou qu’il soit activé deux fois ou pas du tout.

Si vous utilisez le sharepoint terminaison Web API et Owin Token, vous devez supprimer toutes les références à CORS dans votre méthode API Web et append la méthode owin correcte car les contrôleurs Web ne fonctionneront pas avec le sharepoint terminaison Token, alors qu’Owin cors fonctionnera Les points de fin d’authentification API et Token commencent donc:

  1. Assurez-vous que le paquet Owin Cors est installé. Supprimez toute ligne dont vous avez par exemple :.config.EnableCors (); à partir de votre fichier WebAPIconfig.cs

  2. Accédez à votre fichier startup.cs et assurez-vous que vous exécutez Owin Cors avant toute autre configuration.

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

  3. Si vous rencontrez toujours des problèmes, rendez-vous sur: Startup.Auth.cs et vérifiez que vous disposez des éléments suivants dans votre méthode ConfigureAuth (vous ne devriez pas en avoir besoin si votre fichier startup.cs est correct)

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

web.config

      

Startup.cs

 var appSettings = WebConfigurationManager.AppSettings; // If CORS settings are present in Web.config if (!ssortingng.IsNullOrWhiteSpace(appSettings["cors:Origins"])) { // Load CORS settings from Web.config var corsPolicy = new EnableCorsAtsortingbute( 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); } 

Remarque : app.UserCors(...) doit être appelé avant de configurer ASP.NET Identity.

Source: Kit de démarrage d’application Web ASP.NET (API Web ASP.NET, Identity, SignalR)

Pour développer la réponse de Youngjae, il existe un excellent didacticiel sur la configuration d’OWIN avec l’API Web et l’activation de CORS à l’adresse http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web- api-2-owin-asp-net-identity /

Vous voudrez append le package NuGet pour CORS avec la commande:
Install-Package Microsoft.Owin.Cors -Version 2.1.0

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

à votre méthode de configuration dans Startup.cs afin qu’il ressemble à quelque chose comme:

 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 réponse pour moi a été trouvée à

Demande CORS de contrôle en amont Web Api 2 pour le jeton porteur

Plus précisément, la demande / Token utilisant une implémentation de OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials ajoutait l’en-tête à nouveau. Ajoutez les éléments OWIN CORS avant toute autre configuration OWIN et supprimez l’en-tête de GrantResourceOwnerCredentials, conformément à ce lien, et le tour est joué. Bonne chance.

Je veux juste partager mon expérience. J’ai passé la moitié de la journée à me cogner la tête et à essayer de le faire fonctionner. J’ai lu de nombreux articles et questions sur SO et à la fin, j’ai compris ce qui n’allait pas.

La ligne

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

n’était pas le premier dans la méthode de Configuration classe de Startup . Quand je l’ai déplacé vers le haut – tout a commencé à fonctionner comme par magie.

Et pas d’en-têtes personnalisés dans web.config ou config.EnableCors(corsPolicy); ou autre chose était nécessaire.

J’espère que cela aidera quelqu’un à gagner du temps.

Vous pouvez trouver ici les multiples façons dont vous pouvez activer CORS à différents endroits: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

Quoi qu’il en soit, j’ai eu le même problème et en ajoutant les en-têtes de différentes manières, je n’ai pas trouvé la solution complète.

J’ai découvert que l’IIS utilise des gestionnaires qui remplacent votre configuration d’application Web CORS si vous ne spécifiez pas le contraire.

Dans mon cas, j’ai également dû supprimer l’utilisation des gestionnaires IIS en ajoutant la configuration suivante au fichier Web.config principal de mon application:

         

Sachez que cette configuration peut être définie par défaut lorsque vous créez un nouveau projet en fonction de son type, mais si vous partez de zéro, vous devrez probablement append cette configuration.

L’ajout d’en-têtes de client peut ne pas vous donner autant de liberté pour personnaliser vos besoins de sécurité. Il ouvre toutes les autres parties de l’api au monde. Le code suivant ne le fait que pour “token”, et une autre partie du contrôleur de l’API doit être effectuée via l’annotation 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 PathSsortingng("/Token"))) { var origin = req.Headers.Get("Origin"); if (!ssortingng.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 } 

Pour activer Cors, suivez les instructions ici .

Lorsque vous utilisez un middleware OWIN pour gérer CORS, il n’est pas nécessaire d’append des en-têtes sur le fichier WebAPIConfig ou web.config. Oui, l’ajout des en-têtes sur le fichier web.config fonctionne lorsque vous souhaitez un access public, mais si vous devez limiter l’access en fonction d’une liste blanche (domaines), autoriser l’access à tous n’est plus ce que vous souhaitez faire.

Avec OWINS, nous pouvons gérer cela en implémentant ce gestionnaire:

 OAuthAuthorizationServerProvider.MatchEndpoint 

Avec ce gestionnaire, nous pouvons détecter la méthode de requête (OPTIONS, POST …) et si la requête doit être traitée comme un endpoint Authorize ou Token. C’est la zone où la logique peut être ajoutée pour vérifier l’en-tête Origin (requête) et valider si ce domaine doit être autorisé en ajoutant l’en-tête de réponse Access-Control-Allow-Origin.

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

Pour plus d’informations à ce sujet, consultez ce lien: http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html

Compléter Soluction. Vous avez juste besoin de changer certains fichiers, ça marche pour moi.

Global.ascx

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

WebApiConfig.cs

Toute la demande a appelé ce code.

 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 EnableCorsAtsortingbute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors); } } 

Un contrôleur

Rien à changer

Web.config

Vous avez besoin d’append des gestionnaires dans votre site web.config