2015-05-06 3 views
0

Я следил за замечательным учебником Taiser Joudah для реализации токенов обновления с Asp.Net Web Api 2 и Owin. Все прошло так хорошо ... кроме того, что я не могу заставить его работать. :-) Все это «кажется», похоже, работает до тех пор, пока я не запрошу токен обновления. Тогда все, что я получаю, это:OAuth Обновить токен не deserialize/invalid_grant

“error”: “invalid_grant” 

и описания для описания. Один из комментариев к этому сообщению имел тот же самый симптом, и ответ заключался в создании MachineKey для web.config. Я попробовал это, но это не помогло. И я думаю, что, возможно, это применимо только тогда, когда сервер Auth и Resource все равно один и тот же, что и в этом случае.

В нижней строке используется PostMan. Я могу сделать запрос для токена обновления, а в ReceiveAsync - контексту. Дезинциализация без очереди не работает. После вызова «context.DeserializeTicket» (refreshToken.ProtectedTicket), «context.Ticket по-прежнему равен нулю. Любопытно, если я вручную десериализую ProtectedTicket с использованием AccessTokenFormat токена токена, он будет десериализоваться должным образом. Но он не работает с помощью объекта 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

: - | Отменить миссию. Самоназванные раны. Это долгая история, но по сути дела я делал именно то, что я сказал ей, я просто не понимал, что я сказал ей сделать это ... По сути, я вручную генерировал первый токен обновления, но сериализовал его с помощью AccessTokenFormat вместо RefreshTokenFormat. – DennisWelu

+1

У меня была такая же проблема, но я не правильно задавал значение ExpiresUtc –

+0

«error»: «invalid_grant» также может означать, что токен обновления истек. Я обнаружил, что я продлеваю срок в 0 секунд до своих токенов обновления. –

ответ

0

Я думаю, ваша проблема заказа вы создаете refresh_token с CreateAsync. Убедитесь, что вы будете следовать ниже порядке:

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

Тогда вы можете упорствовать маркер в БД. Но имейте в виду, что нет необходимости упорствовать. Вы можете DeserializeTicket из context.Token в ReceiveAsync:

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

Надеется, что это поможет!

0

Следуя той же обучающей, у меня была та же проблема, что это работает для меня

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

    token.ProtectedTicket = context.SerializeTicket(); 
    //... 
} 
Смежные вопросы