Как сделать аутентификацию CORS в WebAPI 2?
сценарий прост, мне нужно войти с другого сервера (отличного от сервера API), чтобы получить маркер доступа.
Я установил Microsoft.Owin.Cors
пакет на сервере API. В , под public void ConfigureAuth(IAppBuilder app)
, Я добавил
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
на WebApiConfig.cs
, под public static void Register(HttpConfiguration config)
, я добавил Эти строки:
// Cors
var cors = new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS");
config.EnableCors(cors);
что еще я должен изменить?
11 ответов
посмотрите, что я нашел!
добавить в некоторые пользовательские заголовки внутри <system.webServer>
.
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</customHeaders>
</httpProtocol>
тогда я могу сделать аутентификацию CORS.
у меня было много проб и ошибок, чтобы настроить его для AngularJS веб-клиента.
Для меня, ниже подходы работает с ASP.NET WebApi 2.2 и служба на основе OAuth.
- установить
Microsoft.AspNet.WebApi.Cors
пакет nuget. - установить
Microsoft.Owin.Cors
пакет nuget. - добавить
config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE"));
к вышеWebApiConfig.Register(config);
в строке Автозагрузка.cs. - добавить
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
до Автозагрузка.Автор.cs. Это необходимо сделать до вызоваIAppBuilder.UseWebApi
- удалите все настройки xml, что сделал Blaise.
Я нашел много вариантов настройки и комбинаций здесь stackoverflow или статьи. Таким образом, подход Блейза может быть или не быть неправильным. Это просто еще одна настройка, я думаю.
после многих часов поиска и просмотра многих различных решений для этого мне удалось заставить это работать в соответствии с приведенным ниже.
существует ряд причин, по которым это происходит. Скорее всего, вы включили CORS в неправильном месте или он включен дважды или не включен вообще.
Если вы используете веб-API и конечную точку токена Owin, вам нужно удалить все ссылки на CORS в методе веб-API и добавить правильный метод owin, потому что веб-api cors не будет работать с конечной точкой токена, в то время как Owin cors будет работать как для веб-API, так и для конечных точек аутентификации токенов, поэтому давайте начнем:
убедитесь, что у Вас установлен пакет Owin Cors удалить любую строку что у вас, например.конфиг.EnableCors (); из вашего WebAPIconfig.cs файл
-
перейдите к вашему запуску.cs-файл и убедитесь, что вы выполняете Owin Cors перед любой другой конфигурацией работает.
app.UseCors (Microsoft.Оуин.Пдбс.Корсоптионы.AllowAll); ConfigureAuth (app);
Если у вас все еще есть проблемы, перейдите в: Startup.Автор.cs и убедитесь, что у вас есть следующее в вашем методе ConfigureAuth (вам не нужно это, если ваш запуск.cs файл правильный)
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
web.config
<appSettings>
<add key="cors:Origins" value="*" />
<add key="cors:Headers" value="*" />
<add key="cors:Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</appSettings>
Автозагрузка.cs
var appSettings = WebConfigurationManager.AppSettings;
// If CORS settings are present in Web.config
if (!string.IsNullOrWhiteSpace(appSettings["cors:Origins"]))
{
// Load CORS settings from Web.config
var corsPolicy = new EnableCorsAttribute(
appSettings["cors:Origins"],
appSettings["cors:Headers"],
appSettings["cors:Methods"]);
// Enable CORS for ASP.NET Identity
app.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = request =>
request.Path.Value == "/token" ?
corsPolicy.GetCorsPolicyAsync(null, CancellationToken.None) :
Task.FromResult<CorsPolicy>(null)
}
});
// Enable CORS for Web API
config.EnableCors(corsPolicy);
}
Примечание: app.UserCors(...)
следует вызвать перед настройкой ASP.NET личность.
источник:ASP.NET стартовый комплект веб-приложения (ASP.NET Web API, Identity, SignalR)
чтобы уточнить ответ Youngjae, есть отличный учебник по настройке OWIN с помощью веб-API и включению CORS в процессе http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
вы захотите добавить пакет NuGet для CORS с помощью команды:Install-Package Microsoft.Owin.Cors -Version 2.1.0
затем добавитьapp.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
к вашему методу конфигурации в запуске.в CS Так выглядит например:
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
ответ для меня был найден в
Web Api 2 Preflight CORS запрос на токен носителя
в частности, запрос / Token с использованием реализации OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials снова добавлял заголовок. Добавьте материал OWIN CORS перед любой другой конфигурацией OWIN и удалите заголовок из GrantResourceOwnerCredentials согласно этой ссылке и вуаля. Удача.
Я просто хочу поделиться своим опытом. Полдня я бил себя по голове и пытался заставить ее работать. Я прочитал множество статей и вопросов, и в конце концов понял, что случилось.
строку
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
был не первым в Startup
класс Configuration
метод. Когда я переместил его наверх-все начало работать волшебным образом.
и никаких пользовательских заголовков в web.config
или config.EnableCors(corsPolicy);
или что-нибудь еще необходимый.
надеюсь, что это поможет кому-то сэкономить время.
вы можете найти здесь несколько способов включения CORS в разных областях: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
в любом случае у меня была та же проблема, и, добавив заголовки по-разному, не получил полного решения.
я узнал, что IIS использует обработчики, которые переопределяют конфигурацию веб-приложения CORS, если вы не укажете противоположное.
в моем случае, мне тоже пришлось удалите использование обработчиков IIS, добавив следующую конфигурацию в основной веб-узел.конфигурация моего приложения:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
имейте в виду, что эта конфигурация может быть установлена по умолчанию при создании нового проекта в зависимости от его типа, но если вы начнете с нуля, вам, вероятно, придется добавить эту конфигурацию.
добавление заголовков клиентов может не дать вам столько свободы в настройке ваших потребностей в безопасности. Он открывает всю остальную часть api миру. Следующий код делает это только для "токена", а другая часть API контроллера должна выполняться через аннотацию EableCors.
public void ConfigureAuth(IAppBuilder app)
{
//other stuff
app.Use(async (context, next) =>
{
IOwinRequest req = context.Request;
IOwinResponse res = context.Response;
if (req.Path.StartsWithSegments(new PathString("/Token")))
{
var origin = req.Headers.Get("Origin");
if (!string.IsNullOrEmpty(origin))
{
res.Headers.Set("Access-Control-Allow-Origin", origin);
}
if (req.Method == "OPTIONS")
{
res.StatusCode = 200;
res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Methods", "GET", "POST");
res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Headers", "authorization", "content-type");
return;
}
}
await next();
});
//other stuff
}
чтобы включить Cors, следуйте инструкции здесь.
при использовании промежуточного программного обеспечения OWIN для обработки CORS нам не нужно добавлять заголовки в WebAPIConfig или в интернете.конфигурационный файл. Да, добавление заголовков в интернете.файл config работает, когда вы хотите, публичный доступ, но если вам нужно ограничить доступ на основе белого списка (Домены), разрешив все доступ-это уже не то, что вы хотели бы сделать.
С OWINS мы можем справиться с этим, реализовав этот обработчик:
OAuthAuthorizationServerProvider.MatchEndpoint
С этим обработчиком, мы можем обнаружение метода запроса (OPTIONS, POST...) и если запрос должен рассматриваться как конечная точка авторизации или маркера. Это область, где логика может быть добавлена для проверки заголовка источника (запроса) и проверки, должен ли этот домен быть разрешен путем добавления заголовка ответа Access-Control-Allow-Origin.
string origin = context.Request.Headers.Get("Origin");
var found = IsDomainAllowed(origin);
if (found){
context.Response.Headers.Add("Access-Control-Allow-Origin",
new string[] { origin });
}
для этого, смотрите по этой ссылке: http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html
Полный Soluction. Вам просто нужно изменить некоторые файлы, работает для меня.
глобальные.ascx и
public class WebApiApplication : System.Web.HttpApplication {
protected void Application_Start()
{
WebApiConfig.Register(GlobalConfiguration.Configuration);
} }
WebApiConfig.cs
весь запрос имеет вызов этого кода.
public static class WebApiConfig {
public static void Register(HttpConfiguration config)
{
EnableCrossSiteRequests(config);
AddRoutes(config);
}
private static void AddRoutes(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "api/{controller}/"
);
}
private static void EnableCrossSiteRequests(HttpConfiguration config)
{
var cors = new EnableCorsAttribute(
origins: "*",
headers: "*",
methods: "*");
config.EnableCors(cors);
} }
Какой-То Контроллер
ничего не изменится.
Web.config
вам нужно добавить обработчики в вас сеть.config
<configuration>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>