CORS не работает в веб-api с аутентификацией OWIN
В моем приложении я использую веб-api с аутентификацией на токенах с поддержкой CORS, но при запросе клиента для токена произошла ошибка из-за CORS (запрос на перекрестный запрос заблокирован: политика одного и того же происхождения запрещает чтение удаленного ресурса в (мое имя сайта). Это можно устранить, переместив ресурс в тот же домен или включив CORS.)
Я сконфигурировал все необходимое для поддержки CORS (думаю, так). здесь моя конфигурация
Класс запуска Owin
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());
}
}
И моя конфигурация 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 }
);
}
}
здесь конфигурация в 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>
и мой заголовок запроса от 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
URL-адреса приложений:
Серверное приложение (которое должно поддерживать CORS)
{http://talenterp}
Конечная точка маркера:
{http://talenterp/token}
Клиентское приложение
{http://talentmvc:85}
NB: я уже добавил
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
в методе GrantResourceOwnerCredentials() моего AuthorizationServerProvider
Ответы
Ответ 1
Убедитесь, что у вас есть только
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
настроен и не также старый config.EnableCors() в вашем файле Global.asax или WebApiConfig. Кроме того: поместите вышеуказанный оператор как первый в вашем классе запуска owin. Да, это действительно имеет значение, установка позже может также привести к тому, что cors не будет работать.
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
... etc
Ответ 2
OWIN и Microsoft.AspNet.WebApi.Cors - две отдельные библиотеки, каждая из которых нуждается в отдельной конфигурации.
Отключить использование CORS с OWIN:
public void Configuration(IAppBuilder app)
{
//app.UseCors(CorsOptions.AllowAll);
Найдите метод GrantResourceOwnerCredentials и добавьте контекст Access-Control-Allow-Origin, чтобы при возврате вызова после завершения аутентификации браузер нашел заголовок и принял его.
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });
Теперь установите пакет Microsoft.AspNet.WebApi.Cors из Nuget в проект webapi и добавьте его в метод 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);
Это сделало это для меня.
Ответ 3
Особенно, если у вас возникла проблема с токеном на предъявителя Web API при использовании CORS, не забудьте поместить "TOKEN" в список ваших разрешенных методов.
Пожалуйста, поместите код в ваш system.webServer из web.config, вот как я решил мой
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
</customHeaders>