OAuth RefreshTokenProvider Invalid_Grant在发布时无效

时间:2016-11-09 10:45:09

标签: c# asp.net api oauth

我有一个使用RefreshTokens运行OAuth的Web Api 2.0,其中包含以下链接;

BitofTech Link Refresh Tokens

在本地,这工作正常,我可以做以下事情;

  1. 使用凭据登录以获得JWT(30分钟生命周期)和Refresh_Token(120小时生命周期)。
  2. 然后,我可以使用JWT访问我的api,直到它过期。
  3. 当JWT在30分钟后过期时,请使用Refresh_Token请求新的。
  4. 然而,当我将api发布到我的服务器时,我发现了一些奇怪的事情。我可以登录并获得一个新的30分钟JWT并使用它来访问api,但是当我尝试使用Refresh_Token授权类型来获取新的JWT时它会发送错误;

      

    “error”“invalid_grant”

    现在,有趣的是,如果我在登录后约10分钟内请求新的JWT(当JWT有效时),则会生成一个新JWT。 (注意我没有在请求的头数据中包含过期的JWT)。请参阅我的帖子截图,了解错误的新JWT;

    invalid grant error

    从服务器上的调试日志中我可以看到,当我调用上面的内容时,它会触发RefreshTokenProviders ReceiveAsync方法,但是它无法反序列化该票证;

    context.DeserializeTicket(token.ProtectedTicket);
    

    (我已经确认了令牌.ProtectedTicket正在从数据库返回。) 当注销context.Ticket显示null?

    任何人都可以了解DeserializeTicket的功能吗?

    有关完整性,请参阅下面的RecevieAsync代码;

    public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
        {
            this.Log().Fatal(() => "In ReceiveAsync");
    
            var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin");
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
    
            string hashedTokenId = new Hash(context.Token).Value();
    
            var container = (IUnityContainer)Startup.HttpConfiguration.DependencyResolver.GetService(typeof(IUnityContainer));
            var _service = new RefreshTokenService(() => container.Resolve<IGPFocusDataContext>());
    
            var refreshToken = _service.Find(
                new RefreshTokenSearchCriteria
                {
                    Hash = hashedTokenId
                });
    
            if (refreshToken.Result != null && refreshToken.Result.Count > 0)
            {
                var token = refreshToken.Result.SingleOrDefault();
                context.DeserializeTicket(token.ProtectedTicket);
    
                this.Log().Fatal(() => "deserialised context.Ticket :" + context.Ticket);
                this.Log().Fatal(() => "deserialised context.Ticket :" + context.Ticket.Identity.Name);
                this.Log().Fatal(() => "deserialised context.Ticket.Properties.IssuedUtc: " + context.Ticket.Properties.IssuedUtc);
                this.Log().Fatal(() => "deserialised context.Ticket.Properties.Expires: " + context.Ticket.Properties.ExpiresUtc);
    
                var result = _service.Remove(token.Id);
    
            }
    

0 个答案:

没有答案