2
2
using Microsoft . Extensions . Caching . Hybrid ;
3
3
using Microsoft . Extensions . Options ;
4
4
using System . IdentityModel . Tokens . Jwt ;
5
+ using System . Security . Cryptography ;
6
+ using System . Text ;
5
7
using UbikLink . Common . Auth ;
6
8
using UbikLink . Security . Contracts . Users . Results ;
7
9
@@ -20,6 +22,8 @@ public async Task RemoveUserTokenAsync(string key)
20
22
21
23
public async Task SetUserTokenAsync ( TokenCacheEntry token )
22
24
{
25
+ token . AccessToken = Encrypt ( token . AccessToken , _authOptions . AuthTokenStoreKey ) ;
26
+ token . RefreshToken = Encrypt ( token . RefreshToken , _authOptions . AuthTokenStoreKey ) ;
23
27
await cache . SetAsync ( $ "{ _authOptions . ClientAppName } _{ token . UserId } ", token , new HybridCacheEntryOptions ( )
24
28
{
25
29
Expiration = TimeSpan . FromMinutes ( _authOptions . RefreshTokenExpTimeInMinutes + 1 ) ,
@@ -36,6 +40,8 @@ public async Task SetUserTokenAsync(TokenCacheEntry token)
36
40
37
41
if ( token == null ) return null ;
38
42
43
+ token . AccessToken = Decrypt ( token . AccessToken , _authOptions . AuthTokenStoreKey ) ;
44
+ token . RefreshToken = Decrypt ( token . RefreshToken , _authOptions . AuthTokenStoreKey ) ;
39
45
token = await RefreshTokenAsync ( token , userId ) ;
40
46
41
47
return token ;
@@ -139,5 +145,42 @@ private Dictionary<string, string> ValuesForRefresh(string token)
139
145
{ "grant_type" , "refresh_token" } ,
140
146
} ;
141
147
}
148
+
149
+ public static string Encrypt ( string plainText , string key )
150
+ {
151
+ using Aes aesAlg = Aes . Create ( ) ;
152
+ aesAlg . Key = Encoding . UTF8 . GetBytes ( key ) ;
153
+ aesAlg . GenerateIV ( ) ;
154
+ ICryptoTransform encryptor = aesAlg . CreateEncryptor ( aesAlg . Key , aesAlg . IV ) ;
155
+
156
+ using MemoryStream msEncrypt = new ( ) ;
157
+ msEncrypt . Write ( aesAlg . IV , 0 , aesAlg . IV . Length ) ;
158
+ using ( CryptoStream csEncrypt = new ( msEncrypt , encryptor , CryptoStreamMode . Write ) )
159
+ using ( StreamWriter swEncrypt = new ( csEncrypt ) )
160
+ {
161
+ swEncrypt . Write ( plainText ) ;
162
+ }
163
+ return Convert . ToBase64String ( msEncrypt . ToArray ( ) ) ;
164
+ }
165
+
166
+ public static string Decrypt ( string cipherText , string key )
167
+ {
168
+ byte [ ] fullCipher = Convert . FromBase64String ( cipherText ) ;
169
+ using Aes aesAlg = Aes . Create ( ) ;
170
+ aesAlg . Key = Encoding . UTF8 . GetBytes ( key ) ;
171
+ byte [ ] iv = new byte [ aesAlg . BlockSize / 8 ] ;
172
+ byte [ ] cipher = new byte [ fullCipher . Length - iv . Length ] ;
173
+
174
+ Array . Copy ( fullCipher , iv , iv . Length ) ;
175
+ Array . Copy ( fullCipher , iv . Length , cipher , 0 , cipher . Length ) ;
176
+
177
+ aesAlg . IV = iv ;
178
+ ICryptoTransform decryptor = aesAlg . CreateDecryptor ( aesAlg . Key , aesAlg . IV ) ;
179
+
180
+ using MemoryStream msDecrypt = new ( cipher ) ;
181
+ using CryptoStream csDecrypt = new ( msDecrypt , decryptor , CryptoStreamMode . Read ) ;
182
+ using StreamReader srDecrypt = new ( csDecrypt ) ;
183
+ return srDecrypt . ReadToEnd ( ) ;
184
+ }
142
185
}
143
186
}
0 commit comments