2016-04-19 5 views
1

Ich habe eine Web-API erstellt, die das JWT-System mit diesem Artikel here verwendet. Wenn die API von einem REST-Client aufgerufen wird, funktioniert das problemlos. Wenn Sie jedoch versuchen, über einen Browser darauf zuzugreifen, wird ein CORS-Fehler ausgegeben, da die richtigen Antwortheader nicht gesendet werden.Antwort-Header nicht auf OwinContext setzen

Startup.cs

app.UseCors(CorsOptions.AllowAll); 

Beachten Sie, dass auf meinem Controller CORS funktioniert gut, es bricht nur für die 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); 
} 

jedoch den Anruf, nachdem Sie das Token zu erhalten, bekomme ich nur diese Antwort-Header zurück.

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 

Gibt es etwas, was ich falsch mache?

Antwort

1

Hinweis: Ich nehme an, dass Sie den gleichen Startup.cs Code verwenden, der in dem geliebten Lernprogramm definiert ist.

Versuchen, den Anruf zu app.UseCors(CorsOptions.AllowAll); an der Spitze der Configuration Methode in Startup.cs zu bewegen:

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

    HttpConfiguration config = new HttpConfiguration(); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    ConfigureOAuth(app); 

    app.UseWebApi(config); 

} 

In Owin jede Middleware in der Rohrleitung nur dann ausgeführt wird, wenn die durchläuft den Aufruf vorhergehende. Aus diesem Grund wird app.UseCors nur nach dem AuthenticationMiddleware (in Ihrem Fall OAuthAuthorizationServer) ausgeführt und nur, wenn es den Fluss in der Pipeline nicht stoppt (z. B. OAuth gibt eine Antwort zurück).

Verschieben der Kors Middleware-Deklaration vor anderen Middlewares stellt sicher, dass es für jede Anforderung ausgeführt wird.

+0

Funktioniert auch nicht, wie ich schon sagte der Header ich mit den OwinContext.Response.headers hinzufügen nicht hinzukommen. Die anderen Controller auf meinem Autorisierungsserver funktionieren problemlos mit CORS. –

+0

Nur um sicher zu sein, versuchen Sie, jeden Aufruf von 'context.OwinContext.Response.Headers.Add ("Access-Control-Allow-Origin", neu [] {"*"}); 'aus Ihrem Code zu entfernen und nur zu verlassen "App.UseCors". –

+0

Nein, immer noch den Fehler bekommen. –

0

Stellen Sie sicher, erlauben CORS in Web-Config

<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 kann http://sitename.com/request nicht laden Die Antwort für das Preflight hat den ungültigen HTTP-Statuscode 405 –

Verwandte Themen