2015-05-20 16 views
6

Ho una configurazione minima di un autor-fornitore, che definisce pretese identitàOAuth portatore di token non funziona

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); 
    } 
} 

sto cercando di accedere ciao-mondo-api, che sta dando errore di accesso non autorizzato.

public class HelloWorldApiController : ApiController 
{ 

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

Ma sto ottenendo 401/accesso non autorizzato per l'API di cui sopra. Ricevo il token bearer sul web-API e lo sto passando anche al server come Bearer ABCD****. Vedo che l'intestazione di autorizzazione è impostata durante il debug in Visual Studio.

Se eseguo il debug di AuthorizeAttribute, ho ottenuto user.Identity.IsAuthenticated come false, che causa il problema. Ma dato che vedo l'intestazione Autorizzazione impostata e ho impostato i dettagli dei reclami in OAuthProvider, perché il AuthorizeAttribute non sta leggendo quelle informazioni?

Nota: questo è un progetto API Web, quindi non vi sono riferimenti a MVC AuthorizeAttribute.

Ecco il setup OWIN:

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()); 
    } 
} 

risposta

4

per farlo funzionare config.Filters.Add(new HostAuthenticationAttribute("bearer")); necessario per aggiungere questa riga beofre attributo Autorizza ...

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

'EnableCorsAttribute' richiede qualsiasi riferimento all'assembly? Ho bisogno del metodo di estensione per usare 'config.EnableCors (...)'? – Bellash

+1

È necessario installare nugget:. Microsoft.owin.cors – harishr

1

Un'altra possibile soluzione che ha funzionato per me è stato quello di non utilizzare HostAuthenticationAttribute, ma impostare il filtro OWIN in modo che sia un filtro attivo come questo:

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

a cosa viene assegnata la variabile bearerOptions? Grazie –