Owin Bearer-Token Funktioniert Nicht für WebApi
Ich gegangen durch Lasten der Dokumentation auf diese, Meine google-Suche zeigt, dass, die ich besucht habe alle links auf der ersten Seite
Problem
Token-Generierung gut funktioniert. Ich habe es konfiguriert mit einem benutzerdefinierten Anbieter wie Z:
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());
}
Aber wenn ich rufe eine geschützte URL und übergeben Sie die bearer-token, ich bekomme immer:
Wie kann ich diagnostizieren oder zu beheben das problem. Wenn möglich, wie kann ich das token-Validierung mich
UPDATE
Hier ist mein AppOAuthProvider. Beide Methoden werden aufgerufen, wenn ich versuche, die Minze ein token, nicht aber, wenn ich versuche, auf eine geschützte Ressource zuzugreifen
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);
}
}
UPDATE 2:
Hier ist meine Konto-Controller
[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");
}
}
UPDATE 3:
Hier ist mein Start.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();
}
}
InformationsquelleAutor Ody | 2014-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die OAuth authorization server-und OAuth-bearer-Authentifizierung vor dem Aufruf UseWebApi auf IAppBuilder. Das folgende ist aus meinem Programm.
Tolle Antwort. Ich weiß jetzt, WARUM es nicht funktioniert. und in hind-Sicht, es macht alles Sinn. Ich Frage mich nun, was ich dachte..
UseNinjectWebApi
registriert WebAPI. Ich habe es auf den obenConfigureAuth
denn ich brauchte Ninject in meinem Authentication block. @ojorma Lösung funktioniert, weil er sich neu registriert, WebAPI. danke für die AntwortDanke, ich hatte das gleiche Problem, denn ich hatte den Aufruf ConfigureAuth routine nach dem Aufruf UseWebApi. Bewegen ConfigureAuth Aufruf ausgeführt wird, bevor alle anderen Sachen in Konfigurations-routine das problem behoben.
InformationsquelleAutor Yang Zhang
Habe ich versucht, diese mit dem ur-Beispiel-Anwendung ist auf github und es funktionierte
Stellt sich heraus, dass das problem war. Auch Für DI zu arbeiten, hatte ich, um app.UseNinjectWebApi nur vor der app.UseWebApi(config)
InformationsquelleAutor ojorma
In Ihrem provider müssen Sie:
Der Grund für dieses ist, dass, wenn Sie nicht überschreiben ValidateClientAuthentication und Validierung der Kontext, es wird angenommen als abgelehnt und erhalten Sie immer, dass Fehler.
Können Sie fügen Sie einen Haltepunkt in Ihrem GrantResourceOwnerCredentials Methode und stellen Sie sicher, dass Sie getroffen wird?
Ja, Beide Methoden werden aufgerufen, wenn ich versuche, ein token zu erstellen, und es funktioniert gut. Allerdings, wenn ich versuche, auf eine geschützte Ressource zuzugreifen, weder wird genannt.
Können Sie uns zeigen Sie Ihre action-Methode? Können Sie sicher, es ist versehen mit der Autorisieren Attribut aus dem System.Web.Http?
Diese Methoden (GrantResourceOwnerCredentials und ValidateClientAuthentication) sollte nur aufgerufen werden, wenn man die token, wenn Sie die token-es ist die OAuthBearerAuthentication middleware verwendet wird
InformationsquelleAutor Rui