2016-04-19 2 views
1

Я создал веб-api, который использует JWT-систему, используя эту статью here. При вызове API от клиента REST он работает нормально. Однако при попытке получить к нему доступ из браузера он дает ошибку CORS, поскольку он не отправляет правильные заголовки ответов.Ответы заголовков не установлены на OwinContext

Startup.cs

app.UseCors(CorsOptions.AllowAll); 

Обратите внимание, что на моих контроллерах CORS работает просто отлично, это просто разрывает на OAuthAuthorizationServer.

CustomOAuthProvider.cs

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

    var user = Database.Users.FirstOrDefault(u => u.Email == context.UserName); 

    if (user == null || !BCrypt.Net.BCrypt.Verify(context.Password, user.Password)) 
    { 
     context.SetError("invalid_grant", "The user name or password is incorrect."); 
     return Task.FromResult<object>(null); 
    } 

    var companyId = int.Parse(context.OwinContext.Get<string>("company_id")); 
    var company = user.Companies.FirstOrDefault(c => c.Id == companyId); 

    if (company == null) 
    { 
     context.SetError("invalid_grant", "You don't belong to that company!"); 
     return Task.FromResult<object>(null); 
    } 

    var identity = new ClaimsIdentity("JWT"); 
    identity.AddClaim(new Claim("uue", user.Email)); 

    var props = new AuthenticationProperties(new Dictionary<string, string> 
    { 
     { "audience", company.ServerUrl } 
    }); 

    var ticket = new AuthenticationTicket(identity, props); 

    context.Validated(ticket); 
    return Task.FromResult<object>(null); 
} 

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

Content-Length:1245 
Content-Type:text/html 
Date:Wed, 20 Apr 2016 20:34:40 GMT 
Server:Microsoft-IIS/8.5 
X-Powered-By:ASP.NET 

Есть ли что-то, что я делаю неправильно?

ответ

1

Примечание: Я предполагаю, что вы используете тот же код Startup.cs, определенный в понравившемся учебнике.

Попробуйте переместить вызов app.UseCors(CorsOptions.AllowAll); в верхней части метода Configuration в Startup.cs:

public void Configuration(IAppBuilder app) 
{ 
    app.UseCors(CorsOptions.AllowAll); 

    HttpConfiguration config = new HttpConfiguration(); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    ConfigureOAuth(app); 

    app.UseWebApi(config); 

} 

В Owin каждый промежуточного слоя в трубопроводе выполняется только тогда, когда предыдущий проходит через вызов. По этой причине app.UseCors выполняется только после AuthenticationMiddleware (в вашем случае OAuthAuthorizationServer) и только в том случае, если он не останавливает поток в конвейере (например, OAuth возвращает ответ).

Перемещение декларации промежуточного программного обеспечения Cors перед другими посредниками гарантирует, что оно выполняется для каждого запроса.

+0

Не работает либо, как я сказал, заголовок я добавляю с OwinContext.Response.headers не добавляется. Другие контроллеры на моем сервере авторизации отлично работают с CORS. –

+0

Чтобы убедиться, попробуйте удалить каждый вызов 'context.OwinContext.Response.Headers.Add (« Access-Control-Allow-Origin », new [] {" * "});' из вашего кода и оставить только 'app.UseCors'. –

+0

Невозможно получить ошибку. –

0

Убедитесь, что вы позволяете CORS в веб-конфигурации

<httpProtocol> 
     <customHeaders> 
     <clear /> 
     <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,OPTIONS,DEBUG" /> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="authorization,content-type" /> 
     </customHeaders> 
    </httpProtocol> 
+0

XMLHttpRequest не может загрузить http://sitename.com/request. Ответ на предполетный период имеет недопустимый код статуса HTTP 405 –

Смежные вопросы