asp.net mvc - mvc - CORS no está funcionando en la API web con autenticación OWIN
enable cors web config (3)
Especialmente si tiene problemas con el token de portador API web al usar CORS, no olvide poner "TOKEN" en la lista de sus métodos permitidos.
Por favor, ponga el código en su system.webServer of web.config, así es como resolví el mío
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
</customHeaders>
En mi aplicación estoy usando API web con autenticación basada en tokens con soporte CORS, pero cuando el cliente solicita el token, ocurre un error debido a CORS (Solicitud de origen cruzado bloqueado: la misma política de origen no permite leer el recurso remoto en (mi sitio) nombre). Esto se puede arreglar moviendo el recurso al mismo dominio o habilitando CORS.)
Había configurado todo lo necesario para el soporte de CORS (creo). aquí mi configuración
Owin start up class
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration
{
DependencyResolver = new StructureMapWebApiDependencyResolver(container)
};
WebApiConfig.Register(config); // registering web api configuration
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); // cors for owin token pipeline
app.UseWebApi(config);
ConfigureOAuth(app);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthAuthorizationServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthAuthorizationServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
Y mi configuración webapi
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors(); // Corse support for Web api
config.MapHttpAttributeRoutes(); // attribute based urls
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
aquí configuración en web.config
<system.webserver>
<httpProtocol>
<customHeaders>
<!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</customHeaders>
</httpProtocol>
</system.webserver>
y mi encabezado de solicitud de mozilla
Accept application/json, text/plain, */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length 67
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Host talenterp
Origin http://192.168.1.11:85
Referer http://192.168.1.11:85/
User-Agent Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Las URL de las aplicaciones son
Aplicación de servidor (que debería ser compatible con CORS)
{http://talenterp}
Token end point:
{http://talenterp/token}
Aplicación de cliente
{http://talentmvc:85}
NB: Ya agregué
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
en el método GrantResourceOwnerCredentials () de mi AuthorizationServerProvider
Asegúrate de tener solo
app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);
configurado, y no también el antiguo estilo ''config.EnableCors ()'' en su Global.asax o WebApiConfig. Además: coloca la declaración anterior como la primera en tu clase de Inicio de owin . Sí, eso realmente hace la diferencia, configurarlo más tarde también puede hacer que cors no funcione.
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
... etc
OWIN y Microsoft.AspNet.WebApi.Cors son dos bibliotecas separadas y cada una necesita una configuración separada.
Deshabilite el uso de CORS con OWIN:
public void Configuration(IAppBuilder app)
{
//app.UseCors(CorsOptions.AllowAll);
Busque el método GrantResourceOwnerCredentials y agregue Access-Control-Allow-Origin al contexto para que, cuando devuelve una llamada una vez completada la autenticación, el navegador encuentre el encabezado y lo acepte.
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });
Ahora instale el paquete Microsoft.AspNet.WebApi.Cors de Nuget en su proyecto webapi, y agréguelo al método Register
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");
config.EnableCors(cors);
Esto lo hizo por mí.