origin falta enable control cabecera allow asp.net angularjs http asp.net-web-api cors

asp.net - falta - enable cors c#



Evitar las solicitudes de opciones de verificación previa con CORS (2)

Estoy creando una aplicación Angular que interactúa con una API creada con la API web de ASP.NET 2. Estoy utilizando la autenticación básica al enviar un encabezado de Authorization con cada solicitud que requiere autenticación:

Fragmento angular:

$http.defaults.headers.common[''Authorization''] = authHeader;

Solicitud:

Accept:application/json, text/javascript Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Access-Control-Max-Age:1728000 Authorization:Basic [base64 encoded credential couplet here] Connection:keep-alive DNT:1 Host: blah.com Origin:http://localhost:9000 Referer:http://localhost:9000/ User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/53

Todo esto funciona bien, pero se envía una solicitud de OPTIONS verificación previa con cada solicitud GET o POST . Esto está afectando principalmente la velocidad percibida de la aplicación. He leído mucho sobre "Solicitudes simples" de CORS y parece que para evitar la temida solicitud de OPTIONS verificación previa es evitar agregar encabezados personalizados en mis solicitudes. He intentado muchas otras cosas, como enviar un Content-Type de Content-Type de text/plain , pero parece que el encabezado de autorización es lo que está violando el requisito de "solicitud simple" de CORS.

Así que parece que es posible que tenga que mover la API para usar la autenticación / autorización basada en token. Para evitar las solicitudes de verificación previa, parece que tendré que colocar el token en la cadena de consulta. Esto está bien, ya que es solo una pequeña aplicación web interna a la que solo podrán acceder un par de usuarios de todos modos. Tengo la intención de implementar el almacenamiento en caché en las respuestas del controlador. Como cada solicitud a una acción de controlador tendrá un token diferente en la cadena de consulta en función del usuario autenticado actualmente, ¿esto hará que el almacenamiento en caché sea inútil?

Asi que:

  1. ¿Cómo puedo evitar las solicitudes de verificación previa (utilizando encabezados de Autorización personalizados si es posible)
  2. Si 1.) no es posible, y paso a la autenticación basada en token, no podré almacenar en la memoria caché las respuestas de la API para las acciones del controlador
  3. ¿Cuáles son los métodos más utilizados para evitar las solicitudes de verificación previa pero también para autenticar a los usuarios de forma segura?

nb Sé que hay un par de otros subprocesos en SO y en otras partes de la web con respecto a esto, pero ninguno de ellos tiende a proporcionar una respuesta definitiva sobre si es posible evitar las solicitudes de verificación previa para GET y POST cuando se utiliza una autorización HTTP personalizada. encabezados



Otra solución que parece estar funcionando bien para mí. En lugar de configurar un proxy y la necesidad de enrutar al mismo dominio, es posible devolver la solicitud de verificación previa directamente desde nginx y, por lo tanto, reducir el tiempo requerido por la solicitud de verificación previa a solo un par de milisegundos.

Aquí hay un simple fragmento de código que puede usarse con nginx.

location / { if ($request_method = ''OPTIONS'') { add_header ''Access-Control-Allow-Origin'' ''*''; add_header ''Access-Control-Allow-Credentials'' ''true''; add_header ''Access-Control-Allow-Methods'' ''GET, POST, OPTIONS''; add_header ''Access-Control-Allow-Headers'' ''Content-Type, Authorization''; add_header ''Access-Control-Max-Age'' 1728000; add_header ''Content-Type'' ''text/plain charset=UTF-8''; add_header ''Content-Length'' 0; return 204; } }

Una vez que la solicitud de verificación previa sea exitosa, es posible simplemente agregar "Access-Control-Allow-Origin" y otras cosas necesarias a las solicitudes ''GET'', ''POST'', etc.