Estoy tratando de habilitar CORS apoyo en mi WebAPI proyecto, y si me permiten la Autenticación Anónima, a continuación, todo funciona bien, pero con la Autenticación de Windows + deshabilita la autenticación anónima, la solicitud de OPCIONES de envió siempre devuelve un 401 no autorizado de respuesta. El sitio solicitando que se encuentra en el DOMINIO así que debería ser capaz de hacer la llamada, ¿hay alguna manera de conseguir alrededor de la cuestión sin deshabilitar la Autenticación de Windows?

  • ¿Has comprobado si la Autenticación Integrada de Windows es en realidad el apoyo en su máquina? http://technet.microsoft.com/en-us/library/cc754628%28v=WS.10%29.aspx
  • Sí, funcionando en W7 Ultimate & también en el Servidor de 2008. Voy a pegar en una respuesta que me dieron desde MS, parece posible, pero no fácil, por cualquier medio, vamos a cambiar a una más oauth estilo en su lugar y separado de nuestra API para permitir anónimo auth, pero el problema para los tokens de autorización.

12 Comentarios

  1. 37

    Puede permitir que sólo OPCIONES de verbo para los usuarios anónimos.

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

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

    • ¿Esto requiere anónimo módulo auth habilitado en IIS?
    • Al parecer sí. «La autenticación anónima proporciona a los usuarios acceso a las áreas públicas de su sitio Web o FTP sin solicite un nombre de usuario o contraseña.» bit.ly/1wjLdO9
    • Esto debe ser aceptado respuesta.
    • Esto NO funciona!
    • Esto absolutamente no funciona, pero hay un problema: el orden es importante. Debe especificar la opción «permitir» etiqueta de primer y el «negar» la etiqueta de segundo. Hacerlo de la otra manera alrededor y usted será frustrado.
    • Parece una buena solución. Ahora, ¿cómo puedo configurar esta configuración para asp.net core?
    • Trabaja Aquí (TM)
    • Gracias!! Nunca habría pensado que necesitaba para cambiar el orden, sólo salvó mi Cordura…. Que se fija.

  2. 22

    Varios años más tarde, pero a través de la respuesta de @dariusriggins y @lex-li me las he arreglado para agregar el siguiente código a mi Mundial.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();
            }
        }
    

    la httpOrigin es realmente estaba en una lista de hosts permitidos pero eso solo complica las cosas. Esto significa que todas las demás solicitudes validadas pero las opciones sólo devuelve.

    Gracias por esta pregunta, que se habría perdido sin ella!

    • He tratado de muchas maneras diferentes para habilitar CORS con WebAPI que se ejecuta en IIS para un Angular 2 cliente, incluyendo la incorporación a la web.de configuración, de datos de anotaciones en mi controlador de las acciones, y la llamada ‘EnableCors’ en WebApiConfig.Registrarse . Esta solución es la sólo uno que en realidad trabajó con la Autenticación de Windows (NTLM), junto con asegurarse de que el Angular 2 cliente http envía withCredentials en el encabezado HTTP. Gracias!
    • Esto es genial!! Funciona como un encanto! Usted incluso no tiene que ponerlo en Application_BeginRequest. Usted puede incluso poner en su página de carga, si es sólo una sola página a la que desea permitir.
    • Crea una nueva respuesta con más información a continuación…
  3. 14

    De MS:

    Si deshabilita la autenticación anónima, es por diseño, IIS devuelve un 401 a cualquier petición. Si tienen habilitada la autenticación de Windows, el 401 de la respuesta, en ese caso habría un encabezado WWW-Authenticate para permitir que el cliente para iniciar un protocolo de autenticación. La pregunta entonces es si el cliente que está usando el cliente puede hacer la autenticación de Windows o no.

    Finalmente, parece que podría ser subyacente a la pregunta acerca de si es posible o no para configurar una URL tal que se permite el acceso anónimo para un verbo (OPCIONES, en este caso), sino que requieren la autenticación de Windows para los demás verbos. IIS no apoyo esto a través de una simple configuración. Podría ser posible para conseguir este comportamiento, que permiten que tanto Anónimo y la autenticación de Windows, la configuración de las Acl en el contenido que denegar el acceso al usuario anónimo y, a continuación, configuración de la asignación de controlador para la URL en cuestión, para que no se compruebe la existencia de fichero asociado con la dirección URL. Pero pasará a jugar con él para confirmar esto.

    • Acabo de notar que muchos chicos han experimentado los errores 401 cuando su API Web está protegido por la autenticación de Windows o tal. CORS de comprobaciones solicitudes no contengan credenciales, por lo que IIS responderá con 401.2 incluso antes de que ASP.NET les toca. Un sucio solución es escribir un módulo HTTP y gancho para IIS tubería, por lo que se registra en HttpApplication.BeginRequest evento donde este módulo devuelve la espera de respuesta 200 para comprobaciones de las solicitudes. Esta solución sólo se aplica a IIS 7+ modo integrado. Lamentablemente el soporte de Microsoft podría no ser consciente de este consejo.
    • Acabo de hacer un post en el blog, blog.lextudio.com/2014/11/… con más información sobre IIS 6 y el modo clásico de los usuarios.
    • leer tu blog, pero, por desgracia, no es detalle de la exacta aplicación de la BeginRequest evento, así que no me queda claro en lo que todos a incluir en la respuesta 200 (por ejemplo, los encabezados, etc.). Entiendo cómo construir HttpModules, solo quisiera una aclaración sobre lo que para responder a la solicitud de comprobaciones.
    • Acabo de actualizar el post para señalar que el artículo debe ser leído. developer.mozilla.org/en-US/docs/Web/HTTP/… contiene incluso muestra las peticiones/respuestas de modo que usted puede seguir fácilmente.
    • Me acaba de publicar una respuesta en la que utiliza solo el mundial.asax que yo no habría llegado a cerca de sin tu artículo en el blog. Gracias!
    • Cualquier ejemplo para asp.net núcleo webapi pls?
    • véase mi respuesta a tu otro post stackoverflow.com/questions/39609811/…

  4. 4

    La forma más sencilla de solucionar este problema es crear una regla de reescritura con la condición de request_method = ^$ OPCIONES. A continuación, establece que la acción es una respuesta personalizada, establece que a 200 OK. A continuación, todas las opciones de solicitudes de responder con 200 en lugar de 401. Esto arreglará el CORS problema.

    Por supuesto, usted todavía necesita para asegurarse de que tiene la correcta origen de la cruz encabezados de solicitud.

    Este dejará de opciones de las solicitudes (que no tengo ningún tipo de credenciales) de responder con 401 cuando integrada de autenticación está habilitada.

    • ¿Puedes ver alguna de posibles problemas de seguridad con esto?
  5. 4

    La aceptada respuesta es correcta, sin embargo yo era la solución de problemas de una api rest con un «nodo con iisnode y npm cors módulo» configuración de un rato y no estaba cómodo con sólo habilitar la autenticación anónima para todos los usuarios. Ya que es un nodo de la aplicación del sistema.etiqueta web no sirve de mucho. Terminé con la siguiente adición a la 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>
    
    • «Trabajó Para Mí» en IIS + Basic Auth, que ha de tener el mismo problema :}
    • Esta solución funcionó para nosotros en IIS 10 Ganar 2016. Asegúrese de que la URL de Autorización de papel/función se instala como parte de la Seguridad de IIS! De lo contrario, esta regla no será implementada.
  6. 3

    Me he topado con el mismo problema hoy en día debido a error en Es decir, 10 y 11, estoy usando ServiceStack en lugar de WebApi, pero el enfoque puede funcionar para usted también.

    1. Habilitado Integrada de Windows y Autenticación Anónima en el Sitio Web de IIS.
    2. Tiene una serie de filtros en el ServiceStack Tubería,
      • Para el manejo de Cors y la solicitud de OPCIONES, En Opciones de solicitud, puedo añadir cabeceras necesarias y finalizar la solicitud,
      • Filtro para la comprobación de includng HttpRequest es Autentica?,
      • etc filtro,

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

    CorsFeature.cs

    AuthenticateFilter

    En mi AppHost,

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

    He modificado la CorsFeature para manejar OptionsRequest además de la adición de encabezados, Autenticar Filtro para verificar las solicitudes autenticadas!

    • Hola, puedes dar un poco más de detalle de volver a lo que hizo? Me estoy enfrentando problemas similares y estoy utilizando también ServiceStack que se implementa a través de SharePoint 2013
    • Estoy omitir la comprobación de usuario Es autenticado por las OPCIONES de las solicitudes. Voy a añadir el código de ejemplo.
  7. 3

    Relacionadas con la Pregunta: IIS secuestra CORS OPCIONES de verificación previa solicitud

    De la fusión de información de las respuestas se encuentran en varios lugares. Si usted necesita para habilitar CORS en un ASP.net página con el método de Autenticación de Windows en la intranet, esto es lo que parece funcionar. Sin los cambios a web.config, esto no funciona.

    Usted debe agregar esta Global.asax

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            string httpOrigin = HttpContext.Current.Request.Params["HTTP_ORIGIN"] ?? HttpContext.Current.Request.Params["ORIGIN"] ?? "*";
            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 (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.StatusCode = 200;
                var httpApplication = sender as HttpApplication;
                httpApplication.CompleteRequest();
            }
        }
    

    Y este a web.config

     <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." 
               verb="*" type="System.Web.Handlers.TransferRequestHandler" 
               preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
    
  8. 1

    Estoy usando la API de Web y OWIN y traté de cada propuesta de solución, 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);
    

    tienes que insertar este código en algún lugar en uno de sus OWIN de inicio de clases.
    Es importante que llame app.UseStageMarker(PipelineStage.Authenticate) porque de lo contrario el preflight check failed.
    Más infos 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 usted necesita definir explícitamente permitido encabezados. Se producirá un error si se utiliza * como un marcador de posición.

    Tal vez ayuda a alguien.

  9. 1

    Entiendo que esto es una vieja pregunta con varias soluciones posibles (así como más preguntas), pero en caso de que alguien más viene a través de este, IIS CORS 1.0 está disponible a partir de Noviembre ’17:

    https://blogs.iis.net/iisteam/introducing-iis-cors-1-0

    https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference

    Se puede descargar a través de IIS de la Plataforma de Windows Installer (WPI). Esto debería resolver muchos de sus CORS problemas de autenticación. ¡A disfrutar!

    • genial!!! He utilizado los siguientes CORS-config en mi web.config: <cors enabled="true"> <add origin="http://192.168.3.253:5001" allowCredentials="true" maxAge="120"> <allowHeaders allowAllRequestedHeaders="true" /> <allowMethods> <add method="GET" /> <add method="HEAD" /> <add method="POST" /> <add method="PUT" /> <add method="DELETE" /> </allowMethods> </add> </cors>
  10. 0

    Lo que funcionó para mí (cuando se trabaja con AngularJS o JQuery) es agregar withCredentials:true para cada solicitud de cliente:

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

    Y habilitar CORS en el servidor, esto se hizo con Microsoft.Owin.Cors de nuget y agregando que en el Inicio como en la figura siguiente:

    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:

  11. 0

    La ampliación de la respuesta proporcionada por @dariusriggins. Revise este post: Microsoft | Desarrollador: Poniendo todo junto – CORS tutorial

    Para las Configuraciones de IIS:

    Regla de autorización

    401 respuesta para CORS solicitud en IIS con Autenticación de Windows activado

    Autorización de la etapa (o Autorización de eventos), debemos asegurarnos de que sólo se permite el anonimato de las solicitudes de CORS de comprobaciones y requieren que todos los otros entrantes de las solicitudes de autenticación de credenciales suministradas. Podemos lograr esto a través de Reglas de Autorización. Un valor predeterminado regla de autorización de concesión de todos los usuarios el acceso al sitio ya está en marcha y se suministra por defecto de IIS. Vamos a empezar por la modificación de esta regla para sólo permitir a los usuarios anónimos, si envían solicitudes que están utilizando las OPCIONES verbo http. A continuación es el objetivo de la configuración de IIS para esta regla de autorización:

    Editar regla de Autorización

    401 respuesta para CORS solicitud en IIS con Autenticación de Windows activado

  12. -1

    Permitiendo SupportCredentials en EnableCorsAttribute en WebApiConfig.cs hizo el truco para mí:

    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 las credenciales al llamar desde javascript ({withCredentials :true})

    • Estoy tratando de lo mismo pero sin credenciales. No hay suerte, incluso de forma anónima auth en
    • Esto no funciona en Chrome. Estoy usando withCredentials=true y las OPCIONES de verificación previa petición aún no envía las credenciales.

Dejar respuesta

Please enter your comment!
Please enter your name here