7
7
using System ;
8
8
using System . Collections . Generic ;
9
9
using System . IdentityModel . Tokens . Jwt ;
10
+ using System . Linq ;
10
11
using System . Security . Claims ;
12
+ using System . Security . Cryptography ;
11
13
using System . Text ;
12
14
using System . Threading . Tasks ;
13
15
@@ -30,8 +32,8 @@ public async Task<AccessToken> GenerateAsync(User user)
30
32
var secretKey = Encoding . UTF8 . GetBytes ( _siteSetting . JwtSettings . SecretKey ) ; // longer that 16 character
31
33
var signingCredentials = new SigningCredentials ( new SymmetricSecurityKey ( secretKey ) , SecurityAlgorithms . HmacSha256Signature ) ;
32
34
33
- var encryptionkey = Encoding . UTF8 . GetBytes ( _siteSetting . JwtSettings . EncryptKey ) ; //must be 16 character
34
- var encryptingCredentials = new EncryptingCredentials ( new SymmetricSecurityKey ( encryptionkey ) , SecurityAlgorithms . Aes128KW , SecurityAlgorithms . Aes128CbcHmacSha256 ) ;
35
+ var encryptionKey = Encoding . UTF8 . GetBytes ( _siteSetting . JwtSettings . EncryptKey ) ; //must be 16 character
36
+ var encryptingCredentials = new EncryptingCredentials ( new SymmetricSecurityKey ( encryptionKey ) , SecurityAlgorithms . Aes128KW , SecurityAlgorithms . Aes128CbcHmacSha256 ) ;
35
37
36
38
var claims = await GetClaimsAsync ( user ) ;
37
39
@@ -51,7 +53,38 @@ public async Task<AccessToken> GenerateAsync(User user)
51
53
52
54
var securityToken = tokenHandler . CreateJwtSecurityToken ( descriptor ) ;
53
55
54
- return new AccessToken ( securityToken ) ;
56
+ return new AccessToken ( securityToken : securityToken ,
57
+ refreshToken : GenerateRefreshToken ( ) ,
58
+ refreshTokenExpiresIn : _siteSetting . JwtSettings . RefreshTokenValidityInDays ) ;
59
+ }
60
+
61
+ public int ? ValidateJwtAccessTokenAsync ( string token )
62
+ {
63
+ var secretKey = Encoding . UTF8 . GetBytes ( _siteSetting . JwtSettings . SecretKey ) ; // longer that 16 character
64
+ var encryptionKey = Encoding . UTF8 . GetBytes ( _siteSetting . JwtSettings . EncryptKey ) ; //must be 16 character
65
+
66
+ var tokenHandler = new JwtSecurityTokenHandler ( ) ;
67
+ try
68
+ {
69
+ tokenHandler . ValidateToken ( token , new TokenValidationParameters
70
+ {
71
+ ValidateIssuerSigningKey = true ,
72
+ IssuerSigningKey = new SymmetricSecurityKey ( secretKey ) ,
73
+ TokenDecryptionKey = new SymmetricSecurityKey ( encryptionKey ) ,
74
+ ValidateIssuer = false ,
75
+ ValidateAudience = false ,
76
+ // set clockskew to zero so tokens expire exactly at token expiration time (instead of 5 minutes later)
77
+ ClockSkew = TimeSpan . Zero
78
+ } , out SecurityToken validatedToken ) ;
79
+
80
+ var jwtSecurityToken = ( JwtSecurityToken ) validatedToken ;
81
+ var userId = int . Parse ( jwtSecurityToken . Claims . First ( claim => claim . Type == "nameid" ) . Value ) ;
82
+ return userId ;
83
+ }
84
+ catch
85
+ {
86
+ return null ;
87
+ }
55
88
}
56
89
57
90
private async Task < IEnumerable < Claim > > GetClaimsAsync ( User user )
@@ -69,5 +102,12 @@ private async Task<IEnumerable<Claim>> GetClaimsAsync(User user)
69
102
70
103
return claims ;
71
104
}
105
+ private static string GenerateRefreshToken ( )
106
+ {
107
+ var randomNumber = new byte [ 64 ] ;
108
+ using var rng = RandomNumberGenerator . Create ( ) ;
109
+ rng . GetBytes ( randomNumber ) ;
110
+ return Convert . ToBase64String ( randomNumber ) ;
111
+ }
72
112
}
73
113
}
0 commit comments