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", этот атрибут также может быть добавлен в методы контроллера. Поэтому он может решить всю проблему.