OAuth bearer token funktioniert nicht
Habe ich ein minimal-setup, der einen auth-provider, legt fest, welche Forderungen-Identität
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);
}
}
Ich versuche, Zugang zu Hallo-Welt-api, die Angabe von unerlaubten Zugriff Fehler.
public class HelloWorldApiController : ApiController
{
[HttpGet]
[Route("api/hello")]
//[AllowAnonymous]
[Authorize]
public HttpResponseMessage FetchAllEnum()
{
return Request.CreateResponse(HttpStatusCode.OK, "Hello World!!!");
}
}
Aber ich bin immer 401/unauthorized access für die oben genannten API. Ich bekomme die Inhaber-token zurück zu dem web-api, und ich bin auch der übergabe an den server als Bearer ABCD****
. Ich sehe, dass der authorization-header gesetzt ist, beim Debuggen in Visual Studio.
Wenn ich die debug - AuthorizeAttribute
ich bin immer user.Identity.IsAuthenticated
als false
, das ist eigentlich das Problem verursacht.
Aber da sehe ich die Authorization-header gesetzt und ich habe Ansprüche, die details in OAuthProvider
warum ist es, dass die AuthorizeAttribute
ist nicht zu Lesen, die Informationen?
Hinweis: Dies ist ein Web-API-Projekt, also gibt es keine Verweise auf das MVC-AuthorizeAttribute.
Hier ist der OWIN-setup:
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());
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere mögliche Lösung, die für mich gearbeitet wurde, nicht zu verwenden, HostAuthenticationAttribute, sondern setzen Sie die OWIN-filter zu einem Aktiven filter wie dieser:
machen, damit es funktioniert
config.Filters.Add(new HostAuthenticationAttribute("bearer"));
notwendig, um fügen Sie diese Zeile vor ermächtigen, Attribut...EnableCorsAttribute
erfordert keine assembly-Referenz ? Brauche ich eine extension-Methode zu verwendenconfig.EnableCors(...)
?