Tengo una pequeña aplicación de API web en un servidor web, con un método GET que devuelve 3 registros y un método POST que acepta un objeto y luego le asigna una ID y devuelve el mismo objeto.
Estoy haciendo llamadas ajax desde una aplicación web local y probando mi implementación de CORS. Casi todo hasta ahora, está funcionando bien. Si no especifico un Access-Control-Allow-Origin (solo establecido en * por ahora), mis llamadas no están permitidas (lo que espero), pero también intenté especificar Access-Control-Allow-Methods y no lo hace Parece que mi entrada restringe la realización de llamadas específicas.
Por ejemplo, esto es lo que contiene mi web.config:
<httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With " /> <add name="Access-Control-Allow-Methods" value="OPTIONS, GET" /> </customHeaders> </httpProtocol> Solo tengo OPTIONS y GET en la lista, pero todavía puedo hacer solicitudes POST. Del mismo modo, si lo configuro como "OPTIONS, POST" , aún puedo realizar solicitudes GET.
EDITAR
Según la respuesta de @geekonaut a continuación, pude ver esta función como esperaba. Intenté probar una solicitud PUT , en lugar de GET o POST , pero luego recibí un error que indicaba que la solicitud OPTIONS (preflight) no estaba permitida. Primero necesitaba agregar una sección en mi archivo Global.asax.cs para aceptar ese método, luego, si alternaba agregar/eliminar PUT en el valor de Access-Control-Allow-Methods de mi web.config, vi que solo permitiría eso método si estaba en la lista.
protected void Application_OnBeginRequest() { if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.StatusCode = 200; HttpContext.Current.Response.End(); } }CORS no evita una solicitud POST simple (o incluso comprobada) basada en su método.
Access-Control-Allow-Methods solo será efectivo para solicitudes que no podrían haberse realizado con un formulario de origen cruzado simple, por ejemplo.
Eso significa: GET y POST pueden omitir Access-Control-Allow-Methods como se describe en la especificación :
Las solicitudes simples de origen cruzado generadas fuera de esta especificación (como los envíos de formularios de origen cruzado usando GET o POST o las solicitudes GET de origen cruzado resultantes de elementos de script) generalmente incluyen credenciales de usuario, por lo que los recursos que se ajustan a esta especificación siempre deben estar preparados para esperar solicitudes simples. Solicitudes de origen cruzado con credenciales.
Debido a esto, los recursos para los cuales las solicitudes simples tienen un significado distinto a la recuperación deben protegerse de la falsificación de solicitudes entre sitios (CSRF) al requerir la inclusión de un token indescifrable en el contenido proporcionado explícitamente de la solicitud.
(énfasis mío)