Подтвердить что ты не робот

Как сделать аутентификацию CORS в WebAPI 2?

Сценарий прост, мне нужно войти с другого сервера (отличного от сервера API), чтобы получить токен доступа.

Я установил пакет Microsoft.Owin.Cors на сервер API. В Startup.Auth.cs файле, под 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);

Что еще я должен изменить?

4b9b3361

Ответ 1

Посмотрите, что я нашел!

Добавьте в пользовательские заголовки внутри <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.

Ответ 2

У меня было много проб и ошибок для его настройки для веб-клиента на основе 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); в файле Startup.cs.
  • Добавьте app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); в файл Startup.Auth.cs. Это необходимо сделать до вызова IAppBuilder.UseWebApi
  • Удалите все настройки xml, которые сделал Блейз.

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

Ответ 3

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

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

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

  • Убедитесь, что у вас установлен пакет Owin Cors. Удалите любую строку что у вас есть eg.config.EnableCors(); из файла WebAPIconfig.cs

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

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); ConfigureAuth (приложение);

  • Если у вас по-прежнему возникают проблемы, выполните следующие действия: Startup.Auth.cs и убедитесь, что в вашем методе ConfigureAuth есть следующее: вам не понадобится это, если ваш файл startup.cs верен.

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

Ответ 4

web.config

<appSettings>
  <add key="cors:Origins" value="*" />
  <add key="cors:Headers" value="*" />
  <add key="cors:Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</appSettings>

Startup.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(...) необходимо вызвать перед настройкой Identity ASP.NET.

Источник: Стартовый комплект веб-приложений ASP.NET (ASP.NET Web API, Identity, SignalR)

Ответ 5

Чтобы подробно разобраться в ответе Youngjae, есть большой учебник по настройке OWIN с помощью Web 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);

для вашего метода конфигурации в Startup.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);
}

Ответ 6

Ответ для меня был найден в

Веб-Api 2 Предпроданный запрос CORS для токена подписчика

В частности, запрос/токен с использованием реализации OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials снова добавлял заголовок. Добавьте материал OWIN CORS перед любой другой конфигурацией OWIN и удалите заголовок из GrantResourceOwnerCredentials, в соответствии с этой ссылкой, и voila. Удачи.

Ответ 7

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

Линия

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

не был первым в методе Startup class Configuration. Когда я переместил его вверх - все начало работать волшебным образом.

И не было никаких настраиваемых заголовков в web.config или config.EnableCors(corsPolicy); или что-то еще.

Надеюсь, это поможет кому-то сэкономить время.

Ответ 8

Добавление заголовков клиентов может не дать вам столько свободы в настройке ваших потребностей в безопасности. Он открывает всю другую часть апи миру. Следующий код делает это только для "токена", а контроллер другой части 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, следуйте инструкциям здесь.

Ответ 9

Здесь вы можете найти несколько способов включить CORS в разных областях: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

В любом случае у меня была такая же проблема, и, добавив заголовки по-разному, не получило полного решения.

Я узнал, что IIS использует обработчики, которые переопределяют конфигурацию вашего веб-приложения CORS, если вы не укажете обратное.

В моем случае мне также пришлось удалить использование обработчиков IIS, добавив следующую конфигурацию в основной файл Web.config моего приложения:

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

Помните, что эта конфигурация может быть установлена ​​по умолчанию при создании нового проекта в зависимости от его типа, но если вы начнете с нуля, вам, вероятно, придется добавить эту конфигурацию.

Ответ 10

При использовании промежуточного ПО OWIN для обработки CORS нам не нужно добавлять заголовки в WebAPIConfig или файл web.config. Да, добавление заголовков в файл web.config работает, когда вы хотите публичный доступ, но если вам нужно ограничить доступ на основе белого списка (домены), то разрешение Все больше не является тем, что вы хотели бы сделать.

С OWINS мы можем справиться с этим, выполнив этот обработчик:

OAuthAuthorizationServerProvider.MatchEndpoint

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

Ответ 11

Полное растворение. Вам просто нужно изменить некоторые файлы, работает для меня.

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

Вам нужно добавить обработчики в web.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>