Ho seguito un tutorial per proteggere un'API Web con OAuth in C#.Restituzione dell'endpoint API "L'autorizzazione è stata rifiutata per questa richiesta." quando si invia token bearer
Sto eseguendo alcuni test e fino ad ora sono riuscito a ottenere correttamente il token di accesso da /token
. Sto usando un'estensione di Chrome chiamata "Advanced REST Client" per testarlo.
{"access_token":"...","token_type":"bearer","expires_in":86399}
Questo è quello che torno da /token
. Tutto sembra a posto.
La mia prossima domanda è per il mio test di controllo API:
namespace API.Controllers
{
[Authorize]
[RoutePrefix("api/Social")]
public class SocialController : ApiController
{
....
[HttpPost]
public IHttpActionResult Schedule(SocialPost post)
{
var test = HttpContext.Current.GetOwinContext().Authentication.User;
....
return Ok();
}
}
}
La richiesta è un POST
e ha l'intestazione:
Authorization: Bearer XXXXXXXTOKEHEREXXXXXXX
ottengo: Authorization has been denied for this request.
restituito in JSON.
Ho provato a fare un GET e ottengo quello che mi aspetterei, che il metodo non è supportato dal momento che non l'ho implementato.
Ecco il mio Provider Authorization:
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
using (var repo = new AuthRepository())
{
IdentityUser user = await repo.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, "User"));
context.Validated(identity);
}
}
Qualsiasi aiuto sarebbe grande. Non sono sicuro se sia la richiesta o il codice che è sbagliato.
edit: Ecco il mio Startup.cs
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
ConfigureOAuth(app);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
Come procederebbe se non si registra WebApi nella pipeline? Sto solo lavorando con il modello di API Web predefinito. Le richieste GET funzionano bene, le richieste POST mi danno 401. Mentre il token è lo stesso. – mwijnands
Questo mi ha sorpreso! Grazie per aver dedicato del tempo per pubblicare questa risposta. – heymega
Ho perso alcune ore dopo il refactoring cercando di trovare una ragione per questo problema. – Tomino