origin net habilitar enable control chrome allow iis-7.5 windows-authentication asp.net-web-api ntlm cors

iis-7.5 - habilitar - enable cors web api net core



401 respuesta para solicitud CORS en IIS con autenticación de Windows habilitada (9)

Estoy tratando de habilitar el soporte CORS en mi proyecto WebAPI, y si habilito la Autenticación anónima, todo funciona bien, pero con Autenticación anónima de Windows deshabilitada, la solicitud de OPCIONES enviada siempre devuelve una respuesta 401 no autorizada. El sitio que lo solicita está en el DOMINIO, por lo que debería poder realizar la llamada, ¿hay alguna forma de evitar el problema sin desactivar la Autenticación de Windows?


De MS:

Si deshabilita la autenticación anónima, es por diseño que IIS devolverá un 401 a cualquier solicitud. Si han habilitado la autenticación de Windows, la respuesta 401 en ese caso tendría un encabezado WWW-Authenticate para permitir que el cliente inicie un protocolo de autenticación. La pregunta entonces es si el cliente que el cliente está utilizando puede hacer la autenticación de Windows o no.

Finalmente, parece que podría haber una pregunta subyacente sobre si es posible configurar o no una URL de modo que se permita el acceso anónimo para un verbo (OPCIONES, en este caso), pero que requiera autenticación de Windows para otros verbos. IIS no es compatible con esto a través de una configuración simple. Es posible obtener este comportamiento habilitando tanto la autenticación anónima como la de Windows, estableciendo ACL en el contenido que niega el acceso al usuario anónimo y luego configurando la asignación del controlador para la URL en cuestión para que no verifique la existencia del archivo asociado con la URL. Pero tomaría algo de juego con esto para confirmar esto.


Estoy usando Web API y OWIN y probé todas las soluciones sugeridas, pero lo único que funcionó fue la siguiente

//use it in your startup class app.Use((context, next) => { if (context.Request.Headers.Any(k => k.Key.Contains("Origin")) && context.Request.Method == "OPTIONS") { context.Response.StatusCode = 200; context.Response.Headers.Add("Access-Control-Allow-Origin", new string[1] { "ALLOWED_ORIGIN" }); context.Response.Headers.Add("Access-Control-Allow-Headers", new string[4] { "Origin", "X-Requested-With", "Content-Type", "Accept" }); context.Response.Headers.Add("Access-Control-Allow-Methods", new string[5] { "GET", "POST", "PUT", "DELETE", "OPTIONS" }); context.Response.Headers.Add("Access-Control-Allow-Credentials", new string[1] { "true" }); return context.Response.WriteAsync(""); } return next.Invoke(); }); //this is important! Without it, it didn''t work (probably because the middleware was too late) app.UseStageMarker(PipelineStage.Authenticate);

necesita insertar este código en alguna de las clases de inicio de OWIN. Es importante llamar a app.UseStageMarker(PipelineStage.Authenticate) porque, de lo contrario, falla la verificación previa. Más información para UseStageMarker -> https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

También es importante que necesites definir explícitamente los encabezados permitidos. Fallará si usa * como marcador de posición.

Quizás ayuda a alguien.


La forma más fácil de solucionar esto es crear una regla de reescritura con la condición request_method = ^ OPTIONS $. Luego configure la acción como una respuesta personalizada, ajústela a 200 OK. Entonces, todas las solicitudes de opciones responderán con 200 en lugar de 401. Esto solucionará el problema CORS.

Por supuesto, aún necesita asegurarse de tener los encabezados de solicitud de origen cruzados correctos.

Esto detendrá las solicitudes de opciones (que no tienen credenciales) respondiendo con 401 cuando está habilitada la autenticación integrada.


La habilitación de SupportCredentials en EnableCorsAttribute en WebApiConfig.cs me funcionó:

public static void Register(HttpConfiguration config) { //enable cors request just from localhost:15136 var cors = new EnableCorsAttribute("http://localhost:15136", "*", "*"); cors.SupportsCredentials = true; config.EnableCors(cors); //other stuff }

https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

Asegúrese de enviar credenciales cuando llame desde javascript ( {withCredentials :true} )


La respuesta aceptada es correcta, sin embargo, estuve solucionando una api de reposo con una configuración de "nodo con iisnode y npm cors" durante un tiempo y no me sentía cómoda con solo habilitar la autenticación anónima para todos los usuarios. Como es una aplicación de nodo, la etiqueta system.web no hace mucho. Terminé con la siguiente adición a web.config:

<system.webServer> <security> <requestFiltering> <hiddenSegments> <add segment="node_modules" /> </hiddenSegments> </requestFiltering> <authorization> <add accessType="Allow" verbs="OPTIONS" users="?" /> <add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" /> </authorization> </security> </system.webServer>


Lo que funcionó para mí (al trabajar con AngularJS o JQuery) es agregar conCredentials: verdadero para cada solicitud en el cliente:

$http.get("http://localhost:88/api/tests", {withCredentials :true})

Y habilitando CORS en el servidor, esto se hizo con Microsoft.Owin.Cors de Nuget y añadiéndolo en el inicio como se muestra a continuación:

public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); ConfigureOAuth(app); WebApiConfig.Register(config); app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); app.UseWebApi(config); }

Referencias


Me encontré con el mismo problema hoy debido a un error en IE 10 y 11 , estoy usando ServiceStack en lugar de WebApi, pero el enfoque también puede funcionar para usted.

  1. Habilita la autenticación integrada y anónima de Windows en el sitio web de IIS.
  2. Tener una serie de filtros en la tubería ServiceStack,
    • Para manejar la solicitud de Cors y OPTIONS, en la solicitud de Opciones, agrego los encabezados necesarios y finalizo la solicitud,
    • Filtro para verificar incluyendo HttpRequest is Authenticated?
    • filtro etc,

Después de pasar por todos los filtros, ejecuta el servicio.

CorsFeature.cs

AuthenticateFilter

En mi AppHost,

appHost.Plugins.Add(new CorsFeature()); appHost.RequestFilters.Add(AuthenticateFilter.Authenticate);

He modificado CorsFeature para manejar OptionsRequest además de agregar encabezados, Authenticate Filter para verificar las solicitudes autenticadas.


Solo puede permitir el verbo OPTIONS para usuarios anónimos.

<system.web> <authentication mode="Windows" /> <authorization> <allow verbs="OPTIONS" users="*"/> <deny users="?" /> </authorization> </system.web>

Según las especificaciones del W3C, el navegador excluye las credenciales del usuario de la verificación previa de CORS: https://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#preflight-request


Varios años después, pero a través de la respuesta de @dariusriggins y @ lex-li, he logrado agregar el siguiente código a mi Global.asax:

public void Application_BeginRequest(object sender, EventArgs e) { string httpOrigin = Request.Params["HTTP_ORIGIN"]; if (httpOrigin == null) httpOrigin = "*"; HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); if (Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.StatusCode = 200; var httpApplication = sender as HttpApplication; httpApplication.CompleteRequest(); } }

httpOrigin se busca realmente en una lista de hosts permitidos, pero eso simplemente complica las cosas. Esto significa que todas las demás solicitudes se validan pero las opciones simplemente vuelven.

Gracias por esta pregunta, ¡me habría perdido sin eso!