【问题标题】:jwt refresh tokens without saving anywherejwt 刷新令牌而不保存任何地方
【发布时间】:2023-03-28 16:26:01
【问题描述】:

我已经在 ASP.NET 框架中实现了刷新令牌,如下所示。它不需要将刷新令牌保存在任何地方。我可以在 ASP.NET Core JWT 中做同样的事情吗?我想要的不是将刷新令牌保存在数据库或其他任何地方。

public class RefreshTokenProvider : IAuthenticationTokenProvider
{
    public async Task CreateAsync(AuthenticationTokenCreateContext context)
    {
        Create(context);
    }

    public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
    {
        Receive(context);
    }

    public void Create(AuthenticationTokenCreateContext context)
    {
        object inputs;
        context.OwinContext.Environment.TryGetValue("Microsoft.Owin.Form#collection", out inputs);

        var grantType = ((FormCollection)inputs)?.GetValues("grant_type");

        var grant = grantType.FirstOrDefault();

        if (grant == null || grant.Equals("refresh_token")) return;

        context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(Constants.RefreshTokenExpiryInDays);

        context.SetToken(context.SerializeTicket());
    }

    public void Receive(AuthenticationTokenReceiveContext context)
    {
        context.DeserializeTicket(context.Token);

        if (context.Ticket == null)
        {
            context.Response.StatusCode = 400;
            context.Response.ContentType = "application/json";
            context.Response.ReasonPhrase = "invalid token";
            return;
        }

        if (context.Ticket.Properties.ExpiresUtc <= DateTime.UtcNow)
        {
            context.Response.StatusCode = 401;
            context.Response.ContentType = "application/json";
            context.Response.ReasonPhrase = "unauthorized";
            return;
        }

        context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(Constants.RefreshTokenExpiryInDays);
        context.SetTicket(context.Ticket);
    }
}

【问题讨论】:

    标签: asp.net-core jwt refresh-token


    【解决方案1】:

    JWT 令牌在使用 JWT 中间件时会自动刷新,并保存在内存中。据我了解,您不需要编写任何类型的代码。只需将 jwt 设置为服务即可。如果从客户端发送 JWT 令牌,它将在服务器端刷新。

    JWT 令牌信息存储在内存中,而不是任何类型的数据库中。毕竟,您必须知道接受哪些令牌以及拒绝哪些令牌,因为不可能不在任何地方存储任何东西。您不需要单独的令牌。只需 JWT 为您处理刷新。

    【讨论】:

    • 你能给我一个链接或代码示例吗?
    • 它只是发送身份验证令牌而不是刷新令牌
    • 是的,因为不需要刷新令牌,因为它会自动刷新令牌。您在 Receive 函数上执行的操作相同。当用户使用令牌发出请求时,令牌将被自动验证和刷新。
    猜你喜欢
    • 2016-03-05
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2017-10-11
    • 2016-10-14
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多