我已经按照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/
答案 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
ReceiveAsync
来public 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();
//...
}