2015-05-20 6 views
6

Arbeits Ich habe einen minimalen Aufbau eines Auth-Provider, die forderungs IdentitätOAuth Inhaber Token nicht

public class SimpleAuthorizationProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     if (context.UserName != context.Password) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 

     context.Validated(identity); 
    } 
} 

Ich versuche, den Zugriff auf hallo-Welt-api setzt, die nicht autorisierte Zugriffsfehler gibt.

public class HelloWorldApiController : ApiController 
{ 

    [HttpGet] 
    [Route("api/hello")] 
    //[AllowAnonymous] 
    [Authorize] 
    public HttpResponseMessage FetchAllEnum() 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, "Hello World!!!"); 
    } 
} 

Aber ich bekomme 401/nicht autorisierten Zugriff für die oben genannte API. Ich bekomme das Bearer Token zurück zur Web-API und übergebe es auch an den Server als Bearer ABCD****. Ich sehe, dass der Autorisierungsheader beim Debuggen in Visual Studio gesetzt ist.

Wenn ich die AuthorizeAttribute debuggen, bekomme ich user.Identity.IsAuthenticated als false, die das Problem tatsächlich verursacht. Aber da ich die Authorization-Kopfzeile gesetzt und ich Ansprüche Details in OAuthProvider gesetzt habe, warum ist das AuthorizeAttribute nicht lesen diese Informationen?

Hinweis: Dies ist ein Web-API-Projekt, daher gibt es keine Verweise auf das MVC AuthorizeAttribute. Hier

ist die OWIN Setup:

public static class WebApiConfig 
{ 
    public static HttpConfiguration Register() 
    { 
     var config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 
     //config.SuppressDefaultHostAuthentication(); //tried with/without this line 
     config.Filters.Add(new AuthorizeAttribute()); 
     config.EnableCors(new EnableCorsAttribute("*", "*", "*", "*")); 
     return config; 
    } 
} 

public class OwinConfiguration 
{ 
    // ReSharper disable once UnusedMember.Local 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureOAuth(app); 
     app.UseCors(CorsOptions.AllowAll); 
     app.UseWebApi(WebApiConfig.Register()); 
    } 

    private void ConfigureOAuth(IAppBuilder app) 
    { 
     var options = new OAuthAuthorizationServerOptions 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60), 
      Provider = new SimpleAuthorizationProvider() 
     }; 

     app.UseOAuthAuthorizationServer(options); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
    } 
} 

Antwort

4

es config.Filters.Add(new HostAuthenticationAttribute("bearer")); funktioniert erforderlich, um diese Linie beofre autorisieren Attribut hinzufügen ...

public static HttpConfiguration Register() 
{ 
    var config = new HttpConfiguration(); 
    config.MapHttpAttributeRoutes(); 

    config.Filters.Add(new HostAuthenticationAttribute("bearer")); //added this 
    config.Filters.Add(new AuthorizeAttribute()); 
    config.EnableCors(new EnableCorsAttribute("*", "*", "*", "*")); 
    return config; 
} 
+0

Erfordert 'EnableCorsAttribute' eine Assemblyreferenz? Brauche ich eine Erweiterungsmethode, um 'config.EnableCors (...)' zu verwenden? – Bellash

+1

Sie müssen Nugget installieren:. Microsoft.owin.cors – harishr

1

Eine andere mögliche Lösung, die für mich gearbeitet wurde nicht Verwenden Sie HostAuthenticationAttribute, setzen Sie den OWIN-Filter jedoch so, dass er ein Active-Filter wie folgt ist:

var bearerOptions = new OAuthBearerAuthenticationOptions 
{ 
    AccessTokenFormat = new JwtFormat(validationParameters), 
    AuthenticationMode = AuthenticationMode.Active, 
}; 
+0

Wie wird die Variable bearerOptions zugewiesen? Vielen Dank –