Как сделать проверку подлинности CORS в веб-API 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 66

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.

  1. установить Microsoft.AspNet.WebApi.Cors пакет nuget.
  2. установить Microsoft.Owin.Cors пакет nuget.
  3. добавить config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE")); к выше WebApiConfig.Register(config); в строке Автозагрузка.cs.
  4. добавить app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); до Автозагрузка.Автор.cs. Это необходимо сделать до звонка IAppBuilder.UseWebApi
  5. удалите все настройки xml, что сделал Блез.

Я нашел много вариантов настройки и комбинаций здесь stackoverflow или статьи. Итак, подход Блейза может быть или не быть неправильным. Это просто еще одна настройка, я думаю.

после многих часов поиска и глядя на многие много различных решений для этого мне удалось получить эту работу в соответствии с ниже.

есть ряд причин, по которым это происходит. Скорее всего, вы включили CORS в неправильном месте или он включен дважды или вообще не включен.

Если вы используете Web API и конечную точку токена Owin, вам нужно удалить все ссылки на CORS в вашем методе Web API и добавить правильный метод owin, потому что web api cors не будет работать с конечной точкой токена, в то время как Owin cors будет работать как для веб-API, так и для конечных точек аутентификации токенов, поэтому давайте начнем:

  1. убедитесь, что у Вас установлен пакет Owin Cors удалите любую строку что у вас есть например.конфиг.EnableCors (); из вашего WebAPIconfig.cs file

  2. зайти в свой стартап.cs-файл и убедитесь, что вы выполняете Owin Cors перед любой другой конфигурацией работает.

    приложение.UseCors (Microsoft.Долг.Корс.Корсопции.AllowAll); ConfigureAuth (app);

  3. Если у вас все еще есть проблемы, перейдите в раздел: запуск.Автор.cs и убедитесь, что у вас есть следующее в вашем методе ConfigureAuth (вам не нужно это, если ваш запуск.cs файл правильный)

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

web.конфигурации

<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 предполетный запрос 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 web app config, если вы не укажете обратное.

в моем случае, я также должен был удалите использование обработчиков 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

С помощью этого обработчика мы можем определите метод запроса (параметры, 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.конфигурации

вам нужно добавить обработчики в вас сеть.конфигурации

<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>