OAuth Refresh Token不反序列化/ invalid_grant

时间:2015-05-06 03:15:01

标签: c# asp.net-web-api oauth-2.0 asp.net-identity owin

我已经按照Taiser Joudah的精彩教程,使用Asp.Net Web Api 2和Owin实现刷新令牌。这一切都很顺利......除了我无法让它发挥作用。 :-)所有“看起来”都像是在我请求刷新令牌之前一直工作。然后我回来的就是:

“error”: “invalid_grant”

并没有说明。该帖子中的一条评论具有相同的症状,响应是为web.config生成一个MachineKey。我尝试了这个,但没有帮助。我想这可能只适用于Auth和Resource服务器不一样的情况,在这种情况下它们都是。

底线是使用PostMan我可以请求刷新令牌,而在ReceiveAsync中则是context.Ticket反序列化不起作用。调用“context.DeserializeTicket(refreshToken.ProtectedTicket);”后,context.Ticket仍然为null。奇怪的是,如果我使用Acccess Token的AccessTokenFormat手动反序列化ProtectedTicket,它将正确地反序列化。但是使用Refresh Token的RefreshTokenFormat对象不起作用:

var thisWorks = Startup.OAuthOptions.AccessTokenFormat.Unprotect(refreshToken.ProtectedTicket);
var thisDoesnt = Startup.OAuthOptions.RefreshTokenFormat.Unprotect(refreshToken.ProtectedTicket);

这看起来确实像配置问题......但我绞尽脑汁并比较了很多样本​​。可能导致这种情况的原因是什么?

EDIT 糟糕...意味着链接到教程文章:http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您使用refresh_token创建CreateAsync的顺序。 请确保遵循以下顺序:

context.Ticket.Properties.IssuedUtc = refreshTokenProperties.IssuedUtc;
context.Ticket.Properties.ExpiresUtc = refreshTokenProperties.ExpiresUtc;
context.SetToken(context.SerializeTicket());

然后您可以将令牌持久保存到DB中。但请记住,没有必要坚持下去。您可以DeserializeTicket中的context.Token ReceiveAsyncpublic async Task ReceiveAsync(AuthenticationTokenReceiveContext context) { context.DeserializeTicket(context.Token); if (context.Ticket != null) { context.SetTicket(context.Ticket); } }

browserWindowSize   {'width': '00409424d52c3a1a30e98cd1cd91638a', 'height': '58b6027d6f7d57e6f62e28fda6ccbb3b'}

希望这有帮助!

答案 1 :(得分:0)

按照相同的教程,我遇到了同样的问题,这对我有用

public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
    //...
    context.Ticket.Properties.AllowRefresh = true;

    token.ProtectedTicket = context.SerializeTicket();
    //...
}