Tengo esta API web ASP.NET y quiero restringir el acceso para que solo funcione cuando lo llame un host específico. No puedo, por lo que sé hasta ahora, asegurarlo por token, porque la URL de la API WEB será una URL de devolución de datos para un sistema que lo llamará automáticamente cuando se realice una determinada acción. Revisé CORS, pero lo que parece hacer CORS es permitir que un dominio específico acceda a la API. Entonces, ¿significa esto que mi WEB API ya está restringida para otros dominios? Entonces, ¿por qué Postman puede acceder a él localmente, incluso si está alojado en Azure?
Solo quiero que mi servicio permita llamadas desde localhost y otro dominio específico solamente.
¿Cómo logro esto?
¡Gracias!
CORS por sí solo le dice a las aplicaciones del navegador/cliente que dejen de enviar solicitudes; en muchas implementaciones de API web de ASP.Net, en realidad no bloquea la canalización de solicitudes. Es por eso que Postman funciona, Postman no ejecuta primero la misma verificación de OPTIONS previa al vuelo , solo envía la solicitud.
Debe considerar agregar autenticación a su API, la autenticación basada en token de portador funciona lo suficientemente bien con y entre las API. Lea sobre Proteger una API web con cuentas individuales e inicio de sesión local en ASP.NET Web API 2.2 , pero eso está fuera del alcance de esta pregunta.
A nivel conceptual, solo necesita interceptar la solicitud entrante en la canalización de OWIN antes que el middleware de la API y solicitar la solicitud si no coincide con sus reglas. Esto debería usarse junto con CORS para que los navegadores respondan de manera estándar.
Como antecedentes, lea Bloquear o limitar el tráfico no deseado a la aplicación web Asp.Net . Por lo general, administramos el filtrado de seguridad a nivel de dominio o IP en la arquitectura de alojamiento o enrutamiento. Los hosts de IIS o Azure tienen muchas políticas integradas para ayudar a administrar esto.
Podría implementar esto a nivel global agregando el siguiente procesador de solicitudes OWIN:
public void ConfigureOAuth(IAppBuilder app) { app.Use((context, next) => { string[] AllowedDomains = new string[] { "::1", "localhost", "mybusinessdomain.com" }; if (!AllowedDomains.Contains(context.Request.Host.Value.ToLower())) { context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; return System.Threading.Tasks.Task.FromResult<object>(null); } return next(); }); // TODO: add in your other OWIN configuration AFTER the request filter. }Si NO está utilizando la canalización de alojamiento OWIN y desea administrar esto globalmente, puede marcar global.asax.cs para manejar
Application_BeginRequest:private static readonly string[] AllowedDomains = new string[] { "::1", "localhost", "mybusinessdomain.com" }; protected void Application_BeginRequest(Object sender, EventArgs e) { if >(!AllowedDomains.Contains(HttpContext.Current.Request.UserHostName.ToLower())) { HttpContext.Current.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; HttpContext.Current.Response.End(); // or transfer to a specific page // Server.Transfer("~/banned.aspx"); } }