当ExchangeToken请求到达时,为什么要调用AuthenticationTokenProvider的CreateAsync?

时间:2015-03-11 10:32:29

标签: asp.net oauth owin

我有AuthenticationTokenProvider抽象的自定义实现。它有两种我正在使用的方法:CreateAsyncReceiveAsync

OAuthAuthorizationServerOptions我已将RefreshTokenProvider设置为我的自定义AuthenticationTokenProvider实施。

我的访问令牌在20分钟后到期。我的刷新令牌将在24小时后到期。当访问令牌过期时,请求附带包含刷新令牌的grant_type=refresh_token。我注意到ReceiveAsync被召唤。设置Ticket AuthenticationTokenReceiveContext属性的逻辑是正确的。但之后调用CreateAsync方法,其中存在在AuthenticationTokenCreateContext中设置标记的逻辑。 Ticket的{​​{1}}属性似乎不是我之前在AuthenticationTokenCreateContext方法中设置的属性。

因此,我收到了新的访问令牌和刷新令牌的响应。我不希望每次想要交换访问令牌时重新发放刷新令牌,我已经有一个有效的24小时。

1 个答案:

答案 0 :(得分:4)

最终我找到了如何回答我的问题。我可以利用OwinContext.Environment存储一个标志,告诉我的刷新令牌尚未过期,因此无需创建新的令牌。

public class RefreshTokenProvider : AuthenticationTokenProvider
{
    private const string IsRefreshTokenExpiredName = "IsRefreshTokenExpired";

    #region ctor
    public RefreshTokenProvider()
    {
    }
    #endregion

    public async override Task CreateAsync(AuthenticationTokenCreateContext context)
    {
        if (!context.OwinContext.Environment.ContainsKey(IsRefreshTokenExpiredName) || (bool)context.OwinContext.Environment[IsRefreshTokenExpiredName])
        {
            var hours = int.Parse(ConfigurationManager.AppSettings["RefreshTokenExpirationHours"]);
            var now = DateTime.UtcNow;
            context.Ticket.Properties.IssuedUtc = now;
            context.Ticket.Properties.ExpiresUtc = now.AddHours(hours);
            context.SetToken(context.SerializeTicket());
        }
    }

    public async override Task ReceiveAsync(AuthenticationTokenReceiveContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { ConfigurationManager.AppSettings["CorsOrigins"] });
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Method", new[] { "POST" });

        context.DeserializeTicket(context.Token);
        if (context.Ticket.Properties.ExpiresUtc > DateTime.UtcNow)
            context.OwinContext.Environment[IsRefreshTokenExpiredName] = false;
    }
}