OAuth 不记名令牌不起作用

Posted

技术标签:

【中文标题】OAuth 不记名令牌不起作用【英文标题】:OAuth bearer token not working 【发布时间】:2015-08-01 11:02:43 【问题描述】:

我有一个 auth-provider 的最小设置,它设置声明身份

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);
    

我正在尝试访问 hello-world-api,这会导致未经授权的访问错误。

public class HelloWorldApiController : ApiController


    [HttpGet]
    [Route("api/hello")]
    //[AllowAnonymous]
    [Authorize]
    public HttpResponseMessage FetchAllEnum()
    
        return Request.CreateResponse(HttpStatusCode.OK, "Hello World!!!");
    

但我得到了对上述 API 的 401/未经授权的访问。我确实将不记名令牌返回给 web-api,并且我还将它作为Bearer ABCD**** 传递给服务器。我确实看到在 Visual Studio 中调试时设置了授权标头。

如果我调试AuthorizeAttribute,我得到user.Identity.IsAuthenticatedfalse,这实际上是导致问题的原因。 但是鉴于我确实看到了 Authorization 标头集并且我在 OAuthProvider 中设置了声明详细信息,为什么 AuthorizeAttribute 没有读取该信息?

注意:这是一个 Web API 项目,因此没有对 MVC AuthorizeAttribute 的引用。

这是 OWIN 设置:

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());
    

【问题讨论】:

【参考方案1】:

另一个对我有用的可能解决方案是不使用 HostAuthenticationAttribute,而是将 OWIN 过滤器设置为像这样的主动过滤器:

var bearerOptions = new OAuthBearerAuthenticationOptions

    AccessTokenFormat = new JwtFormat(validationParameters),
    AuthenticationMode = AuthenticationMode.Active,
;

【讨论】:

bearerOptions 变量分配给什么?谢谢 app.UseOAuthBearerAuthentication()【参考方案2】:

要使其工作config.Filters.Add(new HostAuthenticationAttribute("bearer")); 需要在授权属性之前添加此行...

public static HttpConfiguration Register()

    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    config.Filters.Add(new HostAuthenticationAttribute("bearer")); //added this
    config.Filters.Add(new AuthorizeAttribute());
    config.EnableCors(new EnableCorsAttribute("*", "*", "*", "*"));
    return config;

【讨论】:

EnableCorsAttribute 是否需要任何程序集引用?我需要扩展方法才能使用config.EnableCors(...)吗? 你需要安装 nugget :. Microsoft.owin.cors

以上是关于OAuth 不记名令牌不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JWT不记名令牌授权不起作用asp net core web api

Alamofire 5.0+ MultipartFormData 上传不记名令牌

Spring Security OAuth2 撤销令牌不起作用

Facebook 登录不起作用,错误:无效的 Oauth 访问令牌。它总是零

使用 OAuth2 保护服务,JWT 令牌不起作用 Spring Cloud

Spring Boot + OAuth + JWT + MySQL 刷新令牌第二次不起作用