我有一个使用RefreshTokens运行OAuth的Web Api 2.0,其中包含以下链接;
在本地,这工作正常,我可以做以下事情;
然而,当我将api发布到我的服务器时,我发现了一些奇怪的事情。我可以登录并获得一个新的30分钟JWT并使用它来访问api,但是当我尝试使用Refresh_Token授权类型来获取新的JWT时它会发送错误;
“error”“invalid_grant”
现在,有趣的是,如果我在登录后约10分钟内请求新的JWT(当JWT有效时),则会生成一个新JWT。 (注意我没有在请求的头数据中包含过期的JWT)。请参阅我的帖子截图,了解错误的新JWT;
从服务器上的调试日志中我可以看到,当我调用上面的内容时,它会触发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);
}