Web Api 2 Comprobaciones CORS solicitud de Portador de Token

Tengo una web-app con una AngularJS front-end y un Web Api 2 back-end, y se utiliza el portador para los tokens de autenticación.

Todo está bien en FireFox & IE, pero con Chrome, mi primera solicitud de inicio de sesión es a VECES pre-sinfín.

Aquí está la llamada de la AngularJS servicio:

$http.post(http://localhost:55483/token, datos, { encabezados: { ‘Content-Type’: ‘application/x-www-form-urlencoded’ } }).éxito(function (respuesta) { … });

La comprobación previa solicitud se inició de nuevo con un «Allow-Access-Control-Origen de error».

Sin embargo, si hago clic en el botón de inicio de Sesión de nuevo (lo re-envío de la solicitud anterior) todo está bien.

Cualquier idea sobre cómo prevenir/trampa/manejar esto?

PS: yo uso la LOC

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

en el ApplicationOAuthProvider.cs archivo para poner el CORS permitir encabezado por el /solicitud de Token, que funciona bien en IE, FireFox y a veces en Chrome.

  • ¿Agregar allowcors en el inicio de webapi?
  • ¿Te refieres a esta LOC: app.UseCors(De Microsoft.Owin.Cors.CorsOptions.AllowAll); traté de poner eso, pero el compilador dice: Owin.IAppBuilder’ no contiene una definición para ‘UseCors’
  • Sí, es similar, pero usted puede ser que necesite para incluir algunos de paquete de nuget para cors
  • Tengo la Owin.Cors paquete de NuGet, agregó en la AllowAll cosa – sigue el mismo problema. Que ‘AllowAll’ parece que sólo se aplica a la Web de la Api de controladores, y no a la /Token de ruta.
  • Di cuenta de esto con la ayuda de post por LeftyX en 29 de Junio: Mover esta LOC aplicación.UseCors(De Microsoft.Owin.Cors.CorsOptions.AllowAll); a la PRIMERA LÍNEA en la ConfigureAuth método de Inicio.Auth.cs. Entonces, QUITAR este LOC contexto.OwinContext.Respuesta.Los encabezados.Add(«Access-Control-Allow-Origin», new[] { «*» }); a partir de la GrantResourceOwnerCredentials() método de ApplicationOAuthProvide.cs. Comprobaciones CORS-solicitud de ellos se maneja adecuadamente, y luego el requet pasa a través de.
  • Gracias FancyNancy por tu comentario! Puede usted hacer su comentario una respuesta a esta pregunta? Su comentario fue la única respuesta que trabajó para mí! Estoy seguro de que alguien más se podía apreciar una determinada respuesta.

InformationsquelleAutor FancyNancy | 2014-11-17

3 Kommentare

  1. 17

    El de abajo es de Lujo comentario:

    Di cuenta de esto con la ayuda de post por LeftyX en 29 de Junio:
    – Mover
    esta LOC app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); a la
    PRIMERA LÍNEA en el ConfigureAuth método de de Inicio.Auth.cs.
    – Entonces,
    QUITAR esta LOC
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",
    new[] { "*" });
    de la GrantResourceOwnerCredentials() método de
    ApplicationOAuthProvide.cs.

    Comprobaciones CORS-solicitud de ellos se
    maneja adecuadamente, y luego el requet pasa a través de


    Gracias man, me salvaste el día entero.

    La causa de que suceda, para muchos chicos, os traigo tu comentario a la casilla de respuesta para que otros chicos puedan ver.

    No quiero llegar voto a favor de este. Por favor, comentar sobre mi respuesta en vez

    Gracias

    • Gracias por publicar esta respuesta de Fantasía, este fue el problema en mi caso, se me fue la creación de cors opción en varios lugares.
    • En el paso 2, puede reescribir encabezado por el uso de context.OwinContext.Response.Headers.SetValues("Access-Control-Allow-Origin", allowedOriginStr);
  2. 4

    Espero que esto pueda ayudar a alguien por ahí. Para mí:

    • la adición de la app.useCors(); LOC no.
    • La adición de la app.useCors(); LOC funcionado para otras personas en mi equipo.

    Así que necesitaba una solución que podría funcionar a través de todos los entornos.

    Al final lo que hice fue agregar el encabezado y el valor a la derecha en la Web.config con los siguientes (donde localhost:9000 es mi nodo aplicación que sirve angular):

    <system.webServer>
        <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://localhost:9000" />
            <add name="Access-Control-Allow-Headers" value="Content-Type"/>
          </customHeaders>
        </httpProtocol>
      </system.webServer>

    A continuación, en la producción sólo puede cambiar el valor de origen para la producción de front-end url.

    Si quieres CORS habilitado para todos los orígenes, cambie el valor a "*".

    • Aunque yo precaución contra habilitar CORS para todos los países de origen por razones obvias.
    • Esta es la mejor respuesta! Ahora uno puede configurar web deploy transforma para diferentes entornos.
    • Exactamente. En mi caso he creado un Web.config.la puesta en escena y una Web.config.la producción
  3. 2

    Por defecto – Control de Acceso-Max-Edad: segundos es 0 y sus peticiones no se almacena en caché.

    Tratar de establecer que el valor máximo de: (Owin selfhost). Se resuelve el problema con OPCIONES extra solicitudes

                app.UseCors(new CorsOptions
                {
                    PolicyProvider = new CorsPolicyProvider
                    {
                        PolicyResolver = context => Task.FromResult(new CorsPolicy
                        {
                            AllowAnyHeader = true,
                            AllowAnyMethod = true,
                            AllowAnyOrigin = true,
                            SupportsCredentials = false,
                            PreflightMaxAge = Int32.MaxValue //<< ---- THIS
                        })
                    }
                });

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea