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:
- ¿Cómo puedo evitar las solicitudes de verificación previa (utilizando encabezados de Autorización personalizados si es posible)
- 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 - ¿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
Creo que esta publicación ( Cómo aplicar la memoria caché de verificación previa de CORS a un dominio completo ) lo dice todo, no hay mucho que puedas hacer al respecto
La única solución simple es agregar un proxy inverso al servidor proxy / web que sirve su aplicación angular (por ejemplo, nginx) para enrutar sus llamadas RESTful a través del mismo dominio, por ejemplo, appdomain.com/api -> apidomain.com.
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.