Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 21 de enero de 2014
Usando la KatanaA través del formulario de contacto del blog, el amigo Carlos G. L. me enviaba una pregunta a raíz del último post de la serie sobre OWIN/Katana, relativo al uso de stage markers:
(...) entonces, ¿esto quiere decir que podemos utilizar un middleware para dar soporte CORS a soluciones basadas en la primera versión de WebAPI o en MVC 4?
Respuesta corta: sí. Siempre que se cumplan los requisitos de plataforma exigidos por Katana y los middlewares que queramos usar, nada impide hacerlo sobre aplicaciones con versiones anteriores de estos frameworks.

Y vamos con la respuesta larga…

En el último artículo de la serie decíamos que el paquete Nuget Microsoft.Owin.Host.SystemWeb permite la ejecución de componentes OWIN/Katana sobre el pipeline de ASP.NET/IIS, lo cual posibilita el uso de middlewares en sistemas y aplicaciones que inicialmente no estaban diseñados para ello.

Esto abre la puerta a posibilidades muy interesantes para aprovechar la potencia de algunos de estos módulos OWIN en aplicaciones basadas en versiones anteriores del framework ASP.NET, siempre y cuando se cumplan los requisitos mínimos para ejecutar Katana y los middlewares que nos interesen.

El caso concreto sobre el que giraba la consulta de Carlos lo encontrábamos muy frecuentemente en aplicaciones MVC o WebAPI: la necesidad de dar soporte a peticiones cross-domain usando CORS (Cross-Origin Resource Sharing). Muy resumidamente, se trata de una técnica que permite a los navegadores web realizar peticiones AJAX hacia un dominio distinto del que procede el script que la realiza; para más información aquí tenéis un gran post de José Manuel Alarcón sobre el tema.

Katana ofrece un middleware para gestionar en el lado servidor este tipo de peticiones cruzadas, que está disponible a través de Nuget en el paquete Microsoft.Owin.Cors, aunque éste sólo está disponible para ASP.NET 4.5 o superior.

Si cumplimos estos requisitos, la forma de ponerlo en funcionamiento es muy sencilla. Primero, añadimos al proyecto el host OWIN para ASP.NET/IIS:
PM> Install-Package Microsoft.Owin.Host.SystemWeb
Y a continuación, añadimos igualmente el middleware CORS proporcionado por Katana:
PM> Install-Package Microsoft.Owin.Cors
Por último, debemos crear la clase de configuración, en la que introduciremos el middleware CORS en el pipeline OWIN:
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
    }
}
¡Y esto es todo! De esta forma tan sencilla podemos ofrecer soporte para CORS en nuestras aplicaciones MVC o WebAPI, aunque no estemos hablando de las versiones más recientes de ambos frameworks.

Pero antes de acabar, un último apunte: el middleware anterior lo hemos introducido en el pipeline de forma que nuestros servicios podrán ser usados desde cualquier host, lo cual en muchas ocasiones no es correcto por ser demasiado permisivo. Si quisiéramos limitar las llamadas a un host de origen específico podríamos utilizar un código como el siguiente, que utiliza un objeto CorsPolicy para indicar los permisos de acceso:
public void Configuration(IAppBuilder app)
{
    var options = new CorsOptions()
    {
        PolicyProvider = new CorsPolicyProvider()
        {
           PolicyResolver = (IOwinRequest context) =>
           {
                var policy = new CorsPolicy()
                             {
                                 AllowAnyHeader = true,
                                 AllowAnyMethod = true,
                                 AllowAnyOrigin = false,
                                 SupportsCredentials = true
                             };
                policy.Origins.Add("http://www.myserver.com");
                return Task.FromResult<CorsPolicy>(policy);
            }
        }
    };
    app.UseCors(options);
}
Espero que os sea de utilidad.

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!