CORS для OWIN и доступа/токена вызывает ошибку "Access-Control-Allow-Origin"

У меня возникли проблемы с защитой моего веб-API с помощью промежуточного продукта owin.

Я установил ниже пакет

Install-Package Microsoft.Owin.Cors -Version 2.1.0

И ниже приведен код ConfigureAuth.cs.

 public void ConfigureAuth(IAppBuilder app)
 {                
      //...
      app.UseOAuthBearerTokens(OAuthOptions);    
      ///Install-Package Microsoft.Owin.Cors -Version 2.1.0
      app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
  }

Я разместил этот проект WebApi по ссылке, например http://webaip.azurewebsites.net

Я пытаюсь получить доступ к методам контроллера выше API с другого сайта, скажем, http://mysite.azurewebsites.net С помощью вышеописанного кода я могу вызвать все методы API, которые не являются безопасными. (Не украшен атрибутом Authorize). Через javascript я не могу вызвать/токен для аутентификации. Ниже приведен код javascript.

function LogIn() {
            var loginData = {
                grant_type: 'password',
                username: 'username',
                password: 'password',                
            };

            $.ajax({
                type: 'POST',
                url: 'http://webaip.azurewebsites.net/Token/',
                data: loginData               

            }).done(function (data) {
                alert('logged in');
                alert(data);
            }).fail(function (data) {
                alert('login problem')
            }).error(function (data) {
                alert('error invoking API');
            });
            return false;
        }

Я становлюсь ниже ошибки

XMLHttpRequest cannot load http://webaip.azurewebsites.net/Token/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://mysite.azurewebsites.net' is therefore not allowed access. The response had HTTP status code 404.

Примечание. Я также попытался использовать код ниже. Это тоже не работает для меня.

public static void Register(HttpConfiguration config)
{
     var json = config.Formatters.JsonFormatter;
     config.Formatters.Remove(config.Formatters.XmlFormatter);
     //Need to have  Microsoft.AspNet.WebApi.Cors package installed.
     config.EnableCors(new EnableCorsAttribute("*","*","*"));
}

Ответы

Ответ 1

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

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

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

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

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        ConfigureAuth(app);
    
  • Если у вас все еще есть проблемы, выполните следующие действия: Startup.Auth.cs и убедитесь, что в вашем методе ConfigureAuth есть следующее: вам не понадобится это, если ваш файл startup.cs верен.

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

Ответ 2

причина, по которой вы получаете эту ошибку, состоит в том, что вы включили CORS для webapi, но не для вашей конечной точки /Token, это инициализируется до того, как конвейер webapi получит настройки CORS.

Итак, помимо того, что вы уже сделали в своем WebApiConfig.cs

Вы должны сделать следующее: (при условии, что у вас есть стандартный проект WebAPI 2)

** Откройте файл: App_Start/IdenityConfig.cs ** и добавьте строку, следующую за//Разрешить cors для...

Я оставил остальное нетронутым, как в обычном шаблоне проекта

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        // Allows cors for the /token endpoint this is different from webapi endpoints. 
        context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });  // <-- This is the line you need

        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<IdentityDb>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = true,
            RequireUniqueEmail = true
        };
        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = false,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

       // rest ommited ... 
        return manager;
    }

Ответ 3

См. мой ответ на этот вопрос

Кроме того, если вы используете angularJS в качестве своего клиента, вы можете посмотреть на мой article, который показывает, как использовать Web API 2 (индивидуальная учетная запись пользователя + поддержка CORS) от клиента AngularJS.

Надеюсь, что это поможет.

Ответ 4

Это решение также может быть использовано:

откройте папку поставщиков и откройте ApplicationOAuthProvider.cs

внутри функции GrantResourceOwnerCredentials() вставьте эту строку:

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

Ответ 5

В случае, если кто-нибудь найдет этот полезный

app.Use(async (context, next) =>
            {
                context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:52436" });
                await next();

            });

Ответ 6

Первый шаг - установить CORS nuget: Microsoft.AspNet.WebApi.Core

Включить его в Startup.cs

        config.EnableCors();

то вы можете делать все, что хотите:

чтобы позволить диспетчеру выставляться внешнему приложению, добавьте этот атрибут:

 [EnableCors([theHostYouWant], "*", "*")]

чтобы разрешить внешнюю аутентификацию, для доступа приложения к "/Token", чтобы разрешить это, в

 [YourApiFolder]/Providers/ApplicationoAuthProvider.cs

найдите

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

добавить

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "[YourDesiredHostAddress]" });

это охватывает как контроллер, так и "/Token", этот атрибут также может быть добавлен в методы контроллера. Поэтому он может решить всю проблему.