# 9.8.3 Habilitando CORS

Los navegadores mas comunes como Firefox, Chrome, Edge cuentan con una característica llamada CORS (Cross-Origin Resource Sharing o Intercambio de Recursos de Origen Cruzado) es un estándar del W3C el cual es un consorcio internacional  que genera recomendaciones y estándares para el desarrollo web.

Este estándar indica que no debes permitir que accedan a tus servicios REST o contenido web desde un dominio o subdominio diferente a donde están los servicios.

Por ejemplo si tu aplicación web desarrollada en angular, react, vue, etc se encuentra en la siguiente url [www.caduca.com](http://www.caduca.com), y tus servicios los tienes en un subdominio, por ejemplo servicios.caduca.com, tus servicios solo estarán disponibles para las páginas que se encuentren en servicios.caduca.com. La mayoría de las navegadores cumplen con este requerimiento de seguridad.Esto busca prevenir que un hacker con otro dominio por ejemplo [www.hackers.com](http://www.hackers.com) no tengan acceso a los servicios de servicios.caduca.com

Cuando necesitas que tus servicios estén disponibles a otros subdominios los puedes habilitar configurando en el servidor donde se encuentran tus servicios en el ejemplo servicios.caduca.com las urls vas a permitir (CORS)

Puedes ver la documentación de CORS aquí

{% embed url="<https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS>" %}

La lista de dominios personalizados la puedes agregar a tu archivo **appsettings.json** para que si deseas agregar nuevas urls no tengas que generar una versión de una dll nueva, si no solamente cambiar este archivo y reiniciar el servicio. En el último renglón **AllowedHost** puedes agregar tus **dominios** y **subdominios** separados por **coma**

{% code title="appsettings.json" %}

```json
{
  "ConnectionStrings": {
  },
  "Tokens": {
    "Key": "4eQXP7GTCTRwC6x6",
    "Issuer": "http://localhost:5000",
    "Audience": "http://localhost:5000"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedOrigins": "tudominio.com"
}
```

{% endcode %}

En .Net Core puedes agregar la lista de dominios permitidos en tu archivo **Startup.cs**, en el método **ConfigureServices**, puedes agregar el código antes de agregar el código para inicializar Swagger y también en el método **Configure**, con el código **Configuration.GetSection** obtienes el contenido de una sección de tu archivo appsettings y con el método values obtienes el valor, como la función para habilitar los cors necesita un arreglo, simplemente separamos la variable por ,&#x20;

{% code title="Startup.cs" %}

```csharp
public void ConfigureServices(IServiceCollection services)
{
    //Demás código debe estar antes de app.UseRouting, app.useMVc
     services.AddCors();
     //Se agrega en generador de Swagger           
}

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
     var urlAceptadas = Configuration
                       .GetSection("AllowedHosts").Value.Split(",");
     app.UseCors(builder => builder.WithOrigins(urlAceptadas)
                           .AllowAnyHeader()
                           .AllowAnyMethod()
                           );
 }
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://abi.gitbook.io/net-core/7.-seguridad/7.8-mejorando-tu-codigo/7.8.3-configurando-cors.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
