.net core 实例教程(十一)生成JWT格式的token密码配置及代码

本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh

系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V

本文实现访问接口秘钥功能,用户登录成功后,接口返回给前端JWT格式的秘钥,之后再访问其他接口需要提供秘钥,否则不允许访问。

一、JWT生成相关代码

在SignUp.Common项目创建JWT文件夹,在文件夹下面创建如下类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

using System;

using System.Collections.Generic;

using System.Linq;

using System.Security.Claims;

using System.Text;

using System.Threading.Tasks;

//JWT秘钥生成接口

namespace SignUp.Common.JWT

{

    public interface ITokenService

    {

        string BuildToken(IEnumerable<Claim> claims, JWTOptions options);

    }

}

//实现JWT接口

using Microsoft.IdentityModel.Tokens;

using SignUp.Common.Extensions;

using System;

using System.Collections.Generic;

using System.IdentityModel.Tokens.Jwt;

using System.Linq;

using System.Security.Claims;

using System.Text;

using System.Threading.Tasks;

namespace SignUp.Common.JWT

{

    public class TokenService : ITokenService

    {

        /// <summary>

        /// 生成JWT

        /// </summary>

        /// <param name="claims"></param>

        /// <param name="options"></param>

        /// <returns></returns>

        public string BuildToken(IEnumerable<Claim> claims, JWTOptions options)

        {

            TimeSpan ExpiryDuration = TimeSpan.FromSeconds(options.ExpireSeconds);

            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.SecKey));

            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);

            var tokenDescriptor = new JwtSecurityToken(options.Issuer, options.Audience, claims,

                expires: DateTime.Now.Add(ExpiryDuration), signingCredentials: credentials);

            return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);

        }

        /// <summary>

        /// 获取过期时间

        /// </summary>

        /// <param name="jwtStr"></param>

        /// <returns></returns>

        public static DateTime GetExp(string jwtStr)

        {

            var jwtHandler = new JwtSecurityTokenHandler();

            JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);

            DateTime expDate = (jwtToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate();

            return expDate;

        }

        public static bool IsExp(string jwtStr)

        {

            return GetExp(jwtStr) < DateTime.Now;

        }

    }

}

//JWT配置参数类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace SignUp.Common.JWT

{

    public class JWTOptions

    {

        /// <summary>

        /// JWT Issuer

        /// </summary>

        public string Issuer { get; set; }

        /// <summary>

        /// JWT Audience

        /// </summary>

        public string Audience { get; set; }

        /// <summary>

        /// JWT SecKey

        /// </summary>

        public string SecKey { get; set; }

        /// <summary>

        /// JWT 过期时间

        /// </summary>

        public int ExpireSeconds { get; set; }

    }

}

//注册服务

using Microsoft.Extensions.DependencyInjection;

using SignUp.Common.Commons;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace SignUp.Common.JWT

{

    class ModuleInitializer : IModuleInitializer

    {

        public void Initialize(IServiceCollection services)

        {

            services.AddScoped<ITokenService, TokenService>();

        }

    }

}

二、配置JWT 在WebApplicationBuilderExtensions类的ConfigureExtraServices方法中增加如下代码:

1

2

3

//JWT生成参数配置,从数据库读取

JWTOptions jwtOpt = configuration.GetSection("JWT").Get();

services.Configure(configuration.GetSection("JWT"));

学习交流

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给您一些关于js-cookie设置token过期时间以及ASP.NET Core Web API之JWT刷新Token的实用技巧。 首先,关于js-cookie设置token过期时间,可以通过以下代码实现: ```javascript // 设置cookie过期时间为1天 Cookies.set('token', 'your_token_value', { expires: 1 }); ``` 其中,`expires`属性表示过期时间,单位为天。 其次,关于ASP.NET Core Web API之JWT刷新Token,可以采用以下方法: 在JWT的payload中加入`exp`属性,表示token的过期时间。当token过期后,客户端需要向服务器发送请求,获取新的token。服务器对于过期的token,可以返回一个特定的状态码,比如401 Unauthorized。客户端接收到该状态码后,可以重新向服务器发送请求,获取新的token。 同时,在服务器端需要实现一个刷新token的接口,接口的功能是根据旧的token生成新的token。具体实现可以参考以下代码: ```csharp [HttpPost("refresh-token")] public IActionResult RefreshToken([FromBody] string token) { // 验证旧的token是否有效 var principal = _jwtService.GetPrincipalFromExpiredToken(token); if (principal == null) return BadRequest("Invalid token"); // 生成新的token var newToken = _jwtService.GenerateToken(principal.Claims); return Ok(newToken); } ``` 其中,`_jwtService`表示JWT的服务类,`GetPrincipalFromExpiredToken`方法用于从过期的token中获取`ClaimsPrincipal`对象,`GenerateToken`方法用于生成新的token。 希望以上内容对您有所帮助。如有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值