asp.net 为什么在Exchange RefreshToken请求到达时调用AuthenticationTokenProvider的CreateAsync?

xqnpmsa8  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(169)

我有AuthenticationTokenProvider抽象的自定义实现,它有两个方法需要重写:一米一米一,一米二米一。
OAuthAuthorizationServerOptions中,我将RefreshTokenProvider设置为我的自定义AuthenticationTokenProvider实现。
我的访问令牌将在20分钟后过期。我的刷新令牌将在24小时后过期。当访问令牌过期时,会出现包含刷新令牌的grant_type=refresh_token请求。我观察到ReceiveAsync被调用。存在设置AuthenticationTokenReceiveContextTicket属性的逻辑。但之后CreateAsync方法被调用,其中AuthenticationTokenCreateContext中有一个设置token的逻辑,AuthenticationTokenCreateContextTicket属性好像不是我之前在ReceiveAsync方法中设置的。
结果我收到了带有新的访问令牌和刷新令牌的响应。我不希望每次我想交换我的访问令牌时都重新颁发刷新令牌,我已经有一个24小时有效的令牌。

uoifb46i

uoifb46i1#

最终我找到了如何回答我的问题。我可以利用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;
    }
}
new9mtju

new9mtju2#

我更喜欢让坏角色获得刷新令牌并能够交换访问令牌的窗口更小。此外,如果还交换了刷新令牌,则以前的刷新令牌无效。如果使用了以前的刷新令牌,则包括访问令牌在内的所有关联令牌都无效。

相关问题