C# OAuth刷新令牌未反序列化/授予无效

C# OAuth刷新令牌未反序列化/授予无效,c#,asp.net-web-api,oauth-2.0,asp.net-identity,owin,C#,Asp.net Web Api,Oauth 2.0,Asp.net Identity,Owin,我已经学习了Taiser Joudah关于使用Asp.NETWebAPI 2和Owin实现刷新令牌的精彩教程。一切都进行得很顺利……只是我无法让它工作。:-)在我请求刷新令牌之前,它似乎一直在工作。那么我得到的回报就是: “error”: “invalid_grant” 而且没有描述。该帖子上的一条评论具有相同的症状,响应是为web.config生成MachineKey。我试过了,但没用。我认为这可能只适用于Auth和资源服务器不一样的情况,在本例中它们是一样的 底线是使用PostMan,我可

我已经学习了Taiser Joudah关于使用Asp.NETWebAPI 2和Owin实现刷新令牌的精彩教程。一切都进行得很顺利……只是我无法让它工作。:-)在我请求刷新令牌之前,它似乎一直在工作。那么我得到的回报就是:

“error”: “invalid_grant”
而且没有描述。该帖子上的一条评论具有相同的症状,响应是为web.config生成MachineKey。我试过了,但没用。我认为这可能只适用于Auth和资源服务器不一样的情况,在本例中它们是一样的

底线是使用PostMan,我可以请求刷新令牌并在ReceiveAsync上下文中执行。票证反序列化不起作用。在调用“context.DeserializeTicket(refreshtToken.ProtectedTicket);”之后,context.Ticket仍然为null。奇怪的是,如果我使用ACCESS令牌的AccessTokenFormat手动反序列化ProtectedTicket,它将正确反序列化。但使用刷新令牌的RefreshTokenFormat对象时不起作用:

var thisWorks = Startup.OAuthOptions.AccessTokenFormat.Unprotect(refreshToken.ProtectedTicket);
var thisDoesnt = Startup.OAuthOptions.RefreshTokenFormat.Unprotect(refreshToken.ProtectedTicket);
这看起来确实是一个配置问题……但我绞尽脑汁,比较了很多样本。这可能是什么原因造成的

编辑
Oops…旨在链接到教程文章:

我认为您的问题在于使用
CreateAsync
创建
refresh\u令牌的顺序。
确保您遵循以下顺序:

context.Ticket.Properties.IssuedUtc = refreshTokenProperties.IssuedUtc;
context.Ticket.Properties.ExpiresUtc = refreshTokenProperties.ExpiresUtc;
context.SetToken(context.SerializeTicket());
然后可以将令牌持久化到DB中。但要记住,没有必要坚持下去。您可以从
ReceiveAsync
中的
context.Token
反序列化ticket

public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
    context.DeserializeTicket(context.Token);
    if (context.Ticket != null)
    {            
        context.SetTicket(context.Ticket);            
    }            
}

希望这有帮助

在同一个教程之后,我遇到了同样的问题,这对我很有效

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

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

:-|中止任务。自伤。说来话长,但本质上它是在做我让它做的事,我只是没意识到我让它这么做。。。基本上,我是手动生成初始刷新令牌,但使用AccessTokenFormat而不是RefreshTokenFormat将其序列化。我遇到了完全相同的问题,但我没有正确设置ExpiresUtc“错误”:“无效授权”也可能意味着刷新令牌已过期。我发现我的刷新时间为0秒tokens@DennisWelu我遵循了完全相同的教程,你是如何解决这个问题的?@Motoko我的问题基本上就是我写的-我应该使用我以AccessTokenFormat复制的RefreshTokenFormat。不幸的是,从这里和其他地方可以看出,造成这一错误的原因可能很多。