web-dev-qa-db-fra.com

CORS ne fonctionne pas dans les API Web avec authentification OWIN

Dans mon application, j'utilise une API Web avec une authentification basée sur un jeton avec le support CORS, mais lorsque la demande client du jeton a été générée, une erreur est survenue en raison de la demande CORS (demande croisée d'origine: la règle d'origine identique interdit la lecture de la ressource distante sur (mon site Ceci peut être corrigé en déplaçant la ressource dans le même domaine ou en activant CORS.)

J'avais configuré tout le nécessaire pour le support CORS (je pense que oui). voici ma configuration

Owin classe de démarrage

   public class Startup
    {
        public void Configuration(IAppBuilder app)
        {


            var config = new HttpConfiguration
            {
                DependencyResolver = new StructureMapWebApiDependencyResolver(container)

            };


            WebApiConfig.Register(config);  // registering web api configuration
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);  // cors for owin token pipeline
            app.UseWebApi(config);
            ConfigureOAuth(app);


        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            var oAuthAuthorizationServerOptions = new OAuthAuthorizationServerOptions()
            {

                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new SimpleAuthorizationServerProvider()
            };
            // Token Generation
            app.UseOAuthAuthorizationServer(oAuthAuthorizationServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }
    }

Et ma configuration webapi

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.EnableCors();  // Corse support for Web api
            config.MapHttpAttributeRoutes(); // attribute based urls

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

        }
    }

ici la configuration dans web.config 

<system.webserver>
 <httpProtocol>
      <customHeaders>
        <!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
      </customHeaders>
    </httpProtocol>
</system.webserver>

et mon en-tête de demande de mozilla

Accept  application/json, text/plain, */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length  67
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    talenterp
Origin  http://192.168.1.11:85
Referer http://192.168.1.11:85/
User-Agent  Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0

Les URL des applications sont

Application serveur (qui devrait prendre en charge CORS)

{http://talenterp}

Point d'arrivée du jeton:

{http://talenterp/token}

Application client

{http://talentmvc:85}

NB: j'ai déjà ajouté 

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

dans la méthode GrantResourceOwnerCredentials () de mon AuthorizationServerProvider 

16
Binson Eldhose

Assurez-vous que vous avez seulement 

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

configuré, et pas aussi l'ancien style 'config.EnableCors ()' dans votre Global.asax ou WebApiConfig. En outre: placez la déclaration ci-dessus en premier dans votre classe de démarrage owin . Oui, cela fait vraiment une différence. Si vous le réglez plus tard, les cors risquent de ne pas fonctionner.

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        ... etc
59
Elger Mensonides

OWIN et Microsoft.AspNet.WebApi.Cors sont deux bibliothèques distinctes, chacune d’elles ayant besoin d’une configuration distincte. 

Désactiver l'utilisation de CORS avec OWIN:

public void Configuration(IAppBuilder app)
{
        //app.UseCors(CorsOptions.AllowAll);

Recherchez la méthode GrantResourceOwnerCredentials et ajoutez Access-Control-Allow-Origin au contexte afin que, lorsqu'il renvoie un appel une fois l'authentification terminée, ce navigateur trouve l'en-tête et l'accepte.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });

Maintenant, installez le paquet Microsoft.AspNet.WebApi.Cors à partir de Nuget dans votre projet webapi et ajoutez-le à la méthode Register

public static void Register(HttpConfiguration config)
{
        var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,Origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");

        config.EnableCors(cors);

Cela l'a fait pour moi. 

5
Dado Kljuco

Surtout si vous rencontrez des problèmes avec le jeton porteur Web API lorsque vous utilisez CORS, n'oubliez pas de mettre "TOKEN" dans la liste de vos méthodes autorisées.

S'il vous plaît mettez le code dans votre system.webServer de web.config, c'est comment j'ai résolu le mien

<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
 </customHeaders>
1