340 Refresh Tokens 02(实现功能)

步骤

1、TokenModel.cs

DTO文件夹下新建TokenModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CitiesManager.Core.DTO
{
    public class TokenModel
    {
        public string? Token { get; set; } 
        public string? RefreshToken { get; set; }
    }
}

2、IJwtService.cs

添加一个方法GetPrincipalFromJwtToken

using CitiesManager.Core.DTO;
using CitiesManager.Core.Identity;
using System;
using System.Security.Claims;
namespace CitiesManager.Core.ServiceContracts
{
    public interface IJwtService
    {
        AuthenticationResponse CreateJwtToken(ApplicationUser user);
        ClaimsPrincipal? GetPrincipalFromJwtToken(string? token);
    }
}

3、JwtService.cs

实现新方法

public ClaimsPrincipal? GetPrincipalFromJwtToken(string? token)
 {
     var tokenValidationParameters = new TokenValidationParameters()
     {
         ValidateAudience = true,
         ValidAudience = _configuration["Jwt:Audience"],
         ValidateIssuer = true,
         ValidIssuer = _configuration["Jwt:Issuer"],
         ValidateLifetime = false,
         ValidateIssuerSigningKey = true,
         IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]))
     };
     JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
     ClaimsPrincipal principal = jwtSecurityTokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken securityToken);
     if (securityToken is not JwtSecurityToken jwtSecurityToken || !jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256,StringComparison.InvariantCultureIgnoreCase))
     {
         throw new SecurityTokenException("Invalid token");
     }
     return principal;
 }

4、AccountController.cs

添加方法GenerateNewAccessToken生成新的Token

[HttpPost("generate-new-jwt-token")]
public async Task<IActionResult> GenerateNewAccessToken(TokenModel tokenModel)
{
    if (tokenModel == null)
    {
        return BadRequest("Invalid client request");
    }

    ClaimsPrincipal? principal = _jwtService.GetPrincipalFromJwtToken(tokenModel.Token);
    if (principal == null)
    {
        return BadRequest("Invalid jwt access token");
    }

    string? email = principal.FindFirstValue(ClaimTypes.Email);
    ApplicationUser? user = await _userManager.FindByEmailAsync(email);

    if (user == null || user.RefreshToken != tokenModel.RefreshToken || user.RefreshTokenExpirationDateTime <= DateTime.Now)
    {
        return BadRequest("Invalid refresh token");
    }

    AuthenticationResponse authenticationResponse = _jwtService.CreateJwtToken(user);
    user.RefreshToken = authenticationResponse.RefreshToken;
    user.RefreshTokenExpirationDateTime = authenticationResponse.RefreshTokenExpirationDateTime;

    await _userManager.UpdateAsync(user);

    return Ok(authenticationResponse);
}

5、account.service.ts

添加如下方法

public postGenerateNewToken(): Observable<any> {
  var token = localStorage["token"];
  var refreshToken = localStorage["refreshToken"] 
  return this.httpClient.post<any>(`${API_BASE_URL}generate-new-jwt-token`, {token: token, refreshToken: refreshToken});
}

6、cities.component.ts

添加如下方法

//Executes when the 'Refresh' button is clicked
refreshClicked(): void {
  this.accountService.postGenerateNewToken().subscribe({
    next: (response: any) => {
      localStorage["token"] = response.token;
      localStorage["refreshToken"] = response.refreshToken;

      this.loadCities();
    },
    error: (error: any) => {
      console.log(error);
    },
    complete: () => { },
  })
}

7、cities.component.html

添加Refresh按钮

 <button type="button" class="button button-blue-back mt" (click)="refreshClicked()">Refresh</button>

结果

点击Refresh会更新refreshToken

实际运用中,需要改成系统自动管理生成RefreshToken。

Gitee获取源码:

https://gitee.com/huang_jianhua0101/asp.-net-core-8.git

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄健华Yeah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值