asp.net-web-api - microsoft - multiple cors header access control allow origin not allowed
El encabezado ''Access-Control-Allow-Origin'' contiene mĂșltiples valores (10)
En realidad, no puede establecer múltiples encabezados Access-Control-Allow-Origin
(o al menos no funcionará en todos los navegadores). En su lugar, puede establecer condicionalmente una variable de entorno y luego usarla en la directiva de Header
:
SetEnvIf Origin "^(https?://localhost|https://[a-z]+/.my/.base/.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
Por lo tanto, en este ejemplo, el encabezado de respuesta se agregará solo si un encabezado de solicitud coincide con RegExp: ^(https?://localhost|https://[az]+/.my/.base/.domain)$
(básicamente significa localhost sobre HTTP o HTTPS y * .my.base.domain sobre HTTPS).
Recuerde habilitar el módulo setenvif
.
Documentos:
- http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif
- http://httpd.apache.org/docs/2.2/mod/mod_headers.html#header
Por cierto. The }e
en %{ORIGIN_SUB_DOMAIN}e
no es un error tipográfico. Es la forma en que usa la variable de entorno en la directiva de Header
.
Estoy usando AngularJS $ http en el lado del cliente para acceder a un punto final de una aplicación de API web ASP.NET en el lado del servidor. Como el cliente está alojado en un dominio diferente como servidor, necesito CORS. Funciona para $ http.post (url, data). Pero tan pronto como autentico al usuario y realizo una solicitud a través de $ http.get (url), obtengo el mensaje
The ''Access-Control-Allow-Origin'' header contains multiple values ''http://127.0.0.1:9000, http://127.0.0.1:9000'', but only one is allowed. Origin ''http://127.0.0.1:9000'' is therefore not allowed access.
Fiddler me muestra que efectivamente hay dos entradas de encabezado en la solicitud get después de una solicitud de opciones exitosa. ¿Qué y dónde estoy haciendo algo mal?
Actualizar
Cuando uso jQuery $ .get en lugar de $ http.get, aparece el mismo mensaje de error. Así que esto no parece ser un problema con AngularJS. Pero, ¿dónde está mal?
Esto sucede cuando tiene la opción de Cors configurada en varias ubicaciones. En mi caso, lo tuve en el nivel de controlador, así como en el Startup.Auth.cs / ConfigureAuth.
Tengo entendido que si quiere que la aplicación sea amplia, simplemente configúrela en Startup.Auth.cs / ConfigureAuth así ... Necesitará una referencia a Microsoft.Owin.Cors
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
Si prefiere mantenerlo en el nivel del controlador, entonces puede simplemente insertarlo en el nivel del Controlador.
[EnableCors("http://localhost:24589", "*", "*")]
public class ProductsController : ApiController
{
ProductRepository _prodRepo;
Esto también puede suceder, por supuesto, si realmente ha configurado su encabezado Access-Control-Allow-Origin
para que tenga múltiples valores. Por ejemplo, una lista de valores separados por comas, que es un tipo de soporte en RFC pero que en realidad no es compatible por la mayoría de los principales navegadores. Tenga en cuenta que el RFC habla sobre cómo permitir más de un dominio sin usar ''*'' también.
Por ejemplo, puedes obtener ese error en Chrome usando un encabezado como ese:
Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com
Esto fue en la Chrome Version 64.0.3282.186 (Official Build) (64-bit)
Tenga en cuenta que si está considerando esto debido a un CDN, y usa Akamai, es posible que desee tener en cuenta que Akamai no almacenará en caché en el servidor si utiliza Vary:Origin
, de la manera que muchos sugieren para resolver este problema.
Probablemente tenga que cambiar la forma en que se genera su clave de caché, utilizando un comportamiento de respuesta "Modificación de la Id. Del caché". Más detalles sobre este tema en esta pregunta relacionada con
Estoy usando Cors 5.1.0.0, después de mucho dolor de cabeza, descubrí que el tema se duplicará en el servidor de los encabezados de control de acceso-permitir-origen y acceso-control-permitir-encabezado.
Se eliminó config.EnableCors()
del archivo WebApiConfig.cs y simplemente se estableció el [EnableCors("*","*","*")]
en la clase Controller.
Verifique este artículo para más detalles.
Nos encontramos con este problema porque habíamos configurado CORS de acuerdo con las mejores prácticas (por ejemplo, asp.net/web-api/overview/security/… ) Y TAMBIÉN tenía un encabezado personalizado <add name="Access-Control-Allow-Origin" value="*"/>
en web.config.
Elimine la entrada web.config, y todo está bien.
Al contrario de la respuesta de @ mww, todavía tenemos EnableCors()
en WebApiConfig.cs Y un EnableCorsAttribute
en el controlador. Cuando sacamos uno o el otro, nos encontramos con otros problemas.
Yo también tenía tanto OWIN como mi WebAPI que aparentemente ambos necesitaron CORS activado por separado, lo que a su vez creó el ''Access-Control-Allow-Origin'' header contains multiple values
errores de ''Access-Control-Allow-Origin'' header contains multiple values
.
Terminé eliminando TODO el código que habilitaba CORS y luego agregué lo siguiente al nodo system.webServer
de mi Web.Config:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
</customHeaders>
</httpProtocol>
Hacer esto cumplió con los requisitos de CORS para OWIN (permitiendo el inicio de sesión) y para WebAPI (permitiendo llamadas API), pero creó un nuevo problema: no se pudo encontrar un método OPTIONS
durante la verificación previa para mis llamadas API. La solución fue sencilla: solo necesitaba eliminar lo siguiente del nodo de handlers
mi Web.Config:
<remove name="OPTIONSVerbHandler" />
Espero que esto ayude a alguien.
acaba de tener este problema con un servidor nodejs.
así es como lo arreglé
ejecuto mi servidor de nodo a través de un nginx proxy
y configuro nginx y node
para allow cross domain requests
y no me gustó, así que lo eliminé de nginx y lo dejé en el nodo y todo salió bien.
si está en IIS, necesita activar CORS en web.config, entonces no necesita habilitar en App_Start / WebApiConfig.cs Método de registro
Mi solución fue, comentó las líneas aquí:
// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);
y escribe en la web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
yo añadí
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, " ", " "))
tanto como
app.UseCors(CorsOptions.AllowAll);
en el servidor. Esto resulta en dos entradas de encabezado. Simplemente usa el último y funciona.
Servidor Apache:
Me paso lo mismo, pero fue porque no tenía comillas (") el asterisco en mi archivo que proporcionaba acceso al servidor, por ejemplo ''.htaccess'':
Header add Access-Control-Allow-Origin: *
Header add Access-Control-Allow-Origin "*"
También puede tener un archivo ''.htaccess'' en una carpeta con otro ''.htaccess'', por ejemplo
/
- .htaccess
- public_html / .htaccess (problem here)
En su caso, en lugar de ''*'', el asterisco sería el servidor ip ( http://127.0.0.1:9000
) al que le da permiso para publicar datos.
ASP.NET:
Verifique que no haya ningún duplicado ''Access-Control-Allow-Origin'' en su código.
Herramientas de desarrollo:
Con Chrome, puedes verificar tus encabezados de solicitud. Presiona la tecla F12 y ve a la pestaña ''Red'', ahora ejecuta la solicitud AJAX y aparecerá en la lista, haz clic y da toda la información que está allí.