22using System . Collections . Generic ;
33using System . Configuration ;
44using System . Data . SqlClient ;
5+ using System . Security . Cryptography ;
6+ using System . Text ;
57using System . Threading . Tasks ;
68
79namespace MODSI_SQLRestAPI
@@ -253,18 +255,6 @@ public async Task SetRandomPieChartsAsync()
253255 #endregion
254256
255257 #region User Management
256- public class User
257- {
258- public int ID { get ; set ; }
259- public string Name { get ; set ; }
260- public string Email { get ; set ; }
261- public string Password { get ; set ; }
262- public string Username { get ; set ; }
263- public string Role { get ; set ; }
264- public DateTime CreatedAt { get ; set ; }
265- public bool IsActive { get ; set ; }
266- public string Group { get ; set ; } // Nova propriedade
267- }
268258
269259 public async Task < List < User > > GetAllUsersAsync ( )
270260 {
@@ -289,7 +279,7 @@ public async Task<List<User>> GetAllUsersAsync()
289279 Role = reader . GetString ( 5 ) ,
290280 CreatedAt = reader . GetDateTime ( 6 ) ,
291281 IsActive = reader . GetBoolean ( 7 ) ,
292- Group = reader . GetString ( 8 ) // Nova coluna
282+ Group = reader . GetString ( 8 )
293283 } ) ;
294284 }
295285 }
@@ -298,31 +288,68 @@ public async Task<List<User>> GetAllUsersAsync()
298288 return users ;
299289 }
300290
301- // Métodos atualizados para incluir o Group:
302-
303291 public async Task AddUserAsync ( User user )
304292 {
293+ var salt = PasswordUtils . GenerateSalt ( ) ;
294+ var passwordHash = PasswordUtils . HashPassword ( user . Password , salt ) ;
295+
305296 using ( SqlConnection conn = new SqlConnection ( _connectionString ) )
306297 {
307298 await conn . OpenAsync ( ) ;
308- var query = $ "INSERT INTO { _user_DB } (Name, Email, Password, Username, Role, CreatedAt, IsActive, [Group]) " +
309- "VALUES (@Name, @Email, @Password, @Username, @Role, @CreatedAt, @IsActive, @Group)" ;
299+ var query = $ "INSERT INTO { _user_DB } (Name, Email, Password, Username, Role, CreatedAt, IsActive, [Group], Salt ) " +
300+ "VALUES (@Name, @Email, @Password, @Username, @Role, @CreatedAt, @IsActive, @Group, @Salt )" ;
310301 using ( SqlCommand cmd = new SqlCommand ( query , conn ) )
311302 {
312303 cmd . Parameters . AddWithValue ( "@Name" , user . Name ) ;
313304 cmd . Parameters . AddWithValue ( "@Email" , user . Email ) ;
314- cmd . Parameters . AddWithValue ( "@Password" , user . Password ) ;
305+ cmd . Parameters . AddWithValue ( "@Password" , passwordHash ) ;
315306 cmd . Parameters . AddWithValue ( "@Username" , user . Username ) ;
316307 cmd . Parameters . AddWithValue ( "@Role" , user . Role ) ;
317308 cmd . Parameters . AddWithValue ( "@CreatedAt" , user . CreatedAt ) ;
318309 cmd . Parameters . AddWithValue ( "@IsActive" , user . IsActive ) ;
319- cmd . Parameters . AddWithValue ( "@Group" , user . Group ) ; // Novo parâmetro
310+ cmd . Parameters . AddWithValue ( "@Group" , user . Group ) ;
311+ cmd . Parameters . AddWithValue ( "@Salt" , salt ) ;
320312 await cmd . ExecuteNonQueryAsync ( ) ;
321313 }
322314 }
323315 }
324316
317+ public async Task < User > AuthenticateUserAsync ( string username , string password )
318+ {
319+ using ( SqlConnection conn = new SqlConnection ( _connectionString ) )
320+ {
321+ await conn . OpenAsync ( ) ;
322+ var query = $ "SELECT ID, Name, Email, Password, Username, Role, CreatedAt, IsActive, [Group], Salt FROM { _user_DB } WHERE Username = @Username";
323+ using ( SqlCommand cmd = new SqlCommand ( query , conn ) )
324+ {
325+ cmd . Parameters . AddWithValue ( "@Username" , username ) ;
326+ using ( SqlDataReader reader = await cmd . ExecuteReaderAsync ( ) )
327+ {
328+ if ( await reader . ReadAsync ( ) )
329+ {
330+ var storedHash = reader . GetString ( 2 ) ;
331+ var salt = reader . GetString ( 9 ) ;
325332
333+ if ( storedHash == PasswordUtils . HashPassword ( password , salt ) )
334+ {
335+ return new User
336+ {
337+ ID = reader . GetInt32 ( 0 ) ,
338+ Name = reader . GetString ( 1 ) ,
339+ Email = reader . GetString ( 2 ) ,
340+ Username = reader . GetString ( 3 ) ,
341+ Role = reader . GetString ( 4 ) ,
342+ CreatedAt = reader . GetDateTime ( 5 ) ,
343+ IsActive = reader . GetBoolean ( 6 ) ,
344+ Group = reader . GetString ( 7 )
345+ } ;
346+ }
347+ }
348+ }
349+ }
350+ }
351+ return null ;
352+ }
326353
327354 public async Task UpdateUserByIdAsync ( User user )
328355 {
@@ -340,13 +367,12 @@ public async Task UpdateUserByIdAsync(User user)
340367 cmd . Parameters . AddWithValue ( "@Role" , user . Role ) ;
341368 cmd . Parameters . AddWithValue ( "@CreatedAt" , user . CreatedAt ) ;
342369 cmd . Parameters . AddWithValue ( "@IsActive" , user . IsActive ) ;
343- cmd . Parameters . AddWithValue ( "@Group" , user . Group ) ; // Novo parâmetro
370+ cmd . Parameters . AddWithValue ( "@Group" , user . Group ) ;
344371 await cmd . ExecuteNonQueryAsync ( ) ;
345372 }
346373 }
347374 }
348375
349-
350376 public async Task < bool > EmailUserExistsAsync ( string email )
351377 {
352378 using ( SqlConnection conn = new SqlConnection ( _connectionString ) )
@@ -362,10 +388,6 @@ public async Task<bool> EmailUserExistsAsync(string email)
362388 }
363389 }
364390
365- // Get use by email
366-
367- //GetUserByEmailAsync
368-
369391 public async Task < User > GetUserByEmailAsync ( string email )
370392 {
371393 User user = null ;
@@ -390,7 +412,7 @@ public async Task<User> GetUserByEmailAsync(string email)
390412 Role = reader . GetString ( 5 ) ,
391413 CreatedAt = reader . GetDateTime ( 6 ) ,
392414 IsActive = reader . GetBoolean ( 7 ) ,
393- Group = reader . GetString ( 8 ) // Nova coluna
415+ Group = reader . GetString ( 8 )
394416 } ;
395417 }
396418 }
@@ -399,9 +421,6 @@ public async Task<User> GetUserByEmailAsync(string email)
399421 return user ;
400422 }
401423
402- //DeleteUserByIdAsync
403-
404-
405424 public async Task DeleteUserByIdAsync ( int id )
406425 {
407426 using ( SqlConnection conn = new SqlConnection ( _connectionString ) )
@@ -416,8 +435,6 @@ public async Task DeleteUserByIdAsync(int id)
416435 }
417436 }
418437
419- //GetUserByIdAsync
420-
421438 public async Task < User > GetUserByIdAsync ( int id )
422439 {
423440 User user = null ;
@@ -442,7 +459,7 @@ public async Task<User> GetUserByIdAsync(int id)
442459 Role = reader . GetString ( 5 ) ,
443460 CreatedAt = reader . GetDateTime ( 6 ) ,
444461 IsActive = reader . GetBoolean ( 7 ) ,
445- Group = reader . GetString ( 8 ) // Nova coluna
462+ Group = reader . GetString ( 8 )
446463 } ;
447464 }
448465 }
@@ -451,7 +468,28 @@ public async Task<User> GetUserByIdAsync(int id)
451468 return user ;
452469 }
453470
471+ public static class PasswordUtils
472+ {
473+ public static string HashPassword ( string password , string salt )
474+ {
475+ using ( var sha256 = SHA256 . Create ( ) )
476+ {
477+ var combined = Encoding . UTF8 . GetBytes ( password + salt ) ;
478+ var hash = sha256 . ComputeHash ( combined ) ;
479+ return Convert . ToBase64String ( hash ) ;
480+ }
481+ }
454482
483+ public static string GenerateSalt ( )
484+ {
485+ var saltBytes = new byte [ 16 ] ;
486+ using ( var rng = RandomNumberGenerator . Create ( ) )
487+ {
488+ rng . GetBytes ( saltBytes ) ;
489+ }
490+ return Convert . ToBase64String ( saltBytes ) ;
491+ }
492+ }
455493 #endregion
456494
457495 }
0 commit comments