Jeton Owin Bearer ne fonctionne pas pour WebApi
Je suis passé par les charges de la documentation sur ce, Ma recherche google montre que j'ai visité tous les liens sur la première page
Problème
Génération du jeton fonctionne très bien. Je l'ai configuré avec un fournisseur personnalisé en tant que tel:
public void ConfigureOAuth(IAppBuilder app)
{
var usermanager = NinjectContainer.Resolve<UserManager>();
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new AppOAuthProvider(usermanager)
});
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
Cependant lorsque j'appelle une URL protégée et passer le porteur du jeton, j'obtiens toujours:
Comment puis-je diagnostiquer ou de résoudre le problème. Si possible, comment puis-je faire le jeton de validation de moi-même
Mise à JOUR
Voici mon AppOAuthProvider. Les deux Méthodes sont appelées quand je suis en train de battre un jeton, mais pas quand j'essaye d'accéder à une ressource protégée
public class AppOAuthProvider : OAuthAuthorizationServerProvider
{
private UserManager _user;
public AppOAuthProvider(UserManager user)
{
_user = user;
}
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
//Get User Information
var getUser = _user.FindUser(context.UserName);
if (getUser.Status == StatusCode.Failed)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return Task.FromResult<object>(null);
}
var user = getUser.Result;
//Get Roles for User
var getRoles = _user.GetRoles(user.UserID);
if (getRoles.Status == StatusCode.Failed)
{
context.SetError("invalid_grant", "Could not determine Roles for the Specified User");
}
var roles = getRoles.Result;
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("UserID", user.UserID.ToString()));
identity.AddClaim(new Claim("UserName", user.UserName));
foreach (var role in roles)
{
identity.AddClaim(new Claim(ClaimTypes.Role, role));
}
context.Validated(identity);
return Task.FromResult<object>(null);
}
}
Mise à JOUR 2:
Voici mon Compte Contrôleur
[RoutePrefix("api/auth/account")]
public class AccountController : ApiController
{
private UserManager _user;
public AccountController(UserManager user)
{
_user = user;
}
[Authorize]
[HttpGet]
[Route("secret")]
public IHttpActionResult Secret()
{
return Ok("Yay! Achievement Unlocked");
}
}
Mise à JOUR 3:
Voici mon Démarrage.cs
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseNinjectMiddleware(NinjectContainer.CreateKernel);
app.UseNinjectWebApi(GlobalConfiguration.Configuration);
GlobalConfiguration.Configure(WebApiConfig.Register);
ConfigureOAuth(app);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(GlobalConfiguration.Configuration);
app.UseWelcomePage();
}
}
source d'informationauteur Ody
Vous devez vous connecter pour publier un commentaire.
Vous devez configurer le serveur d'autorisation OAuth et OAuth porteur d'authentification avant d'appeler UseWebApi sur IAppBuilder. La suite est à partir de mon programme.
J'ai essayé cela avec ur exemple d'application sur github et il a travaillé
De votre fournisseur, vous devez:
La raison pour cela est que si vous ne la supplante pas ValidateClientAuthentication et de valider le contexte, il est considéré comme rejeté et vous aurez toujours cette erreur.