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());
}
}
'EnableCorsAttribute' richiede qualsiasi riferimento all'assembly? Ho bisogno del metodo di estensione per usare 'config.EnableCors (...)'? – Bellash
È necessario installare nugget:. Microsoft.owin.cors – harishr