Point final de l'API renvoyant "Autorisation refusée pour cette demande" lors de l'envoi d'un jeton de support
J'ai suivi un tutoriel pour protéger une API Web avec OAuth en C#.
Je suis en train de faire quelques tests et jusqu'à présent, j'ai été en mesure d'obtenir le jeton d'accès avec succès à partir de /token
. Je suis à l'aide d'une extension Chrome appelé "Advanced Client REST" à l'essai.
{"access_token":"...","token_type":"bearer","expires_in":86399}
C'est ce que je serai de retour à partir de /token
. Tout semble bon.
Ma prochaine demande est à mon test de l'API Contrôleur:
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 demande est une POST
et a la tête:
Authorization: Bearer XXXXXXXTOKEHEREXXXXXXX
J'obtiens: Authorization has been denied for this request.
retourné en JSON.
J'ai essayé de faire un OBTENIR ainsi et j'obtiens ce que je m'attends à ce que la méthode n'est pas prise en charge car je n'ai pas la mettre en œuvre.
Voici mon Fournisseur d'Autorisation:
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);
}
}
Toute aide serait super. Je ne suis pas sûr si c'est la demande ou le code qui est faux.
edit:
Voici mon 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());
}
}
source d'informationauteur Bri Veillette
Vous devez vous connecter pour publier un commentaire.
Question est assez simple:
Modifier l'ordre de vos OWIN pipeline.
Pour OWIN pipeline afin de votre configuration assez important. Dans votre cas, vous essayez d'utiliser votre site Web de l'API du gestionnaire avant le OAuth gestionnaire. A l'intérieur, vous validez votre demande, vous avez trouvé sécurisé d'action et d'essayer de les valider à contre courant
Owin.Context.User
. En ce moment, cet utilisateur n'existent pas parce que son jeu de le jeton OAuth Gestionnaire qui l'a appelé plus tard.Vous avez à ajouter une demande avec ce schéma:
meilleure chose à faire est d'utiliser le pré-défini une série de revendications:
Vous pouvez trouver
ClaimTypes
dansSystem.Security.Claims
.Une autre chose à considérer est le filtre de votre rôle dans votre Contrôleur/Action:
Vous pouvez trouver un exemple simple d'application, auto-hébergé owin avec jquery client ici.
Ressemble à la version de "Système.IdentityModel.Jetons.Jwt" qui co-existe avec les autres Owin assemblées n'est pas bon.
Dans le cas où vous êtes à l'aide de "Microsoft.Owin.De sécurité.Jwt" version 2.1.0, vous devriez être en utilisant le Système".IdentityModel.Jetons.Jwt" assemblée de la version 3.0.2.
À partir du gestionnaire de paquets de la console, essayez: