some changes

This commit is contained in:
2026-02-21 16:00:22 -08:00
parent 043ff337c1
commit 7348785e8a
2 changed files with 21 additions and 45 deletions
+11 -37
View File
@@ -5,50 +5,24 @@ namespace WinStudentGoalTracker.BaseClasses;
public class BaseController : ControllerBase public class BaseController : ControllerBase
{ {
protected (Guid userId, ActionResult? error) GetUserIdFromClaims() protected (Guid userId, string email, Guid programId, string role, ActionResult? error) GetProgramUserFromClaims()
{ {
var userIdClaim = User.FindFirst("user_id")?.Value var userIdClaim = User.FindFirst("user_id")?.Value;
?? User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (!Guid.TryParse(userIdClaim, out var userId))
return (Guid.Empty, string.Empty, Guid.Empty, string.Empty, Unauthorized("Missing or invalid user_id claim."));
if (string.IsNullOrWhiteSpace(userIdClaim) || !Guid.TryParse(userIdClaim, out var userId))
{
return (Guid.Empty, Unauthorized("Missing or invalid user_id claim."));
}
return (userId, null);
}
protected (string email, List<string> roles, ActionResult? error) GetUserDetailsFromClaims()
{
var email = User.FindFirst(ClaimTypes.Email)?.Value; var email = User.FindFirst(ClaimTypes.Email)?.Value;
if (string.IsNullOrWhiteSpace(email)) if (string.IsNullOrWhiteSpace(email))
{ return (Guid.Empty, string.Empty, Guid.Empty, string.Empty, Unauthorized("Missing email claim."));
return (string.Empty, new List<string>(), Unauthorized("Missing email claim."));
}
var roles = User.FindAll(ClaimTypes.Role).Select(claim => claim.Value).ToList();
return (email, roles, null);
}
protected bool HasRole(string role)
{
return User.IsInRole(role);
}
protected bool HasAnyRole(params string[] roles)
{
return roles.Any(User.IsInRole);
}
protected (Guid programId, ActionResult? error) GetProgramIdFromClaims()
{
var programIdClaim = User.FindFirst("program_id")?.Value; var programIdClaim = User.FindFirst("program_id")?.Value;
if (!Guid.TryParse(programIdClaim, out var programId))
return (Guid.Empty, string.Empty, Guid.Empty, string.Empty, Unauthorized("Missing or invalid program_id claim."));
if (string.IsNullOrWhiteSpace(programIdClaim) || !Guid.TryParse(programIdClaim, out var programId)) var role = User.FindFirst(ClaimTypes.Role)?.Value;
{ if (string.IsNullOrWhiteSpace(role))
return (Guid.Empty, Unauthorized("Missing or invalid program_id claim.")); return (Guid.Empty, string.Empty, Guid.Empty, string.Empty, Unauthorized("Missing role claim."));
}
return (programId, null); return (userId, email, programId, role, null);
} }
} }
+10 -8
View File
@@ -15,6 +15,7 @@ public class AuthController : BaseController
private readonly UserRepository _userRepo = new(); private readonly UserRepository _userRepo = new();
private readonly AuthRepository _authRepo = new(); private readonly AuthRepository _authRepo = new();
private readonly TokenService _tokenService; private readonly TokenService _tokenService;
private static readonly int _loginExpiration = 60 * 60 * 24 * 31; // Refresh token expires after 1 month.
public AuthController(TokenService tokenService) public AuthController(TokenService tokenService)
{ {
@@ -125,8 +126,9 @@ public class AuthController : BaseController
}); });
} }
var (userId, userIdError) = GetUserIdFromClaims(); var userIdClaim = User.FindFirst("user_id")?.Value;
if (userIdError != null) return userIdError; if (!Guid.TryParse(userIdClaim, out Guid userId))
return Unauthorized(new ResponseResult<SelectProgramResponse> { Success = false, Message = "Invalid session token." });
if (!Guid.TryParse(dto.ProgramId, out Guid programId)) if (!Guid.TryParse(dto.ProgramId, out Guid programId))
{ {
@@ -177,7 +179,7 @@ public class AuthController : BaseController
programUser.IdProgram, programUser.IdProgram,
refreshTokenHash, refreshTokenHash,
refreshTokenSalt, refreshTokenSalt,
expiresInSeconds: 2592000, // 30 days expiresInSeconds: _loginExpiration,
deviceInfo: deviceInfo, deviceInfo: deviceInfo,
userAgent: userAgent userAgent: userAgent
); );
@@ -296,13 +298,13 @@ public class AuthController : BaseController
}); });
} }
var newJwtToken = _tokenService.GenerateToken( var newJwt = _tokenService.GenerateToken(
programUser.IdUser, programUser.IdUser,
programUser.Email!, programUser.Email!,
programUser.RoleInternalName, programUser.RoleInternalName,
programUser.IdProgram); programUser.IdProgram);
var jwtExpiresIn = _tokenService.GetTokenExpiryInSeconds(newJwtToken); var jwtExpiresIn = _tokenService.GetTokenExpiryInSeconds(newJwt);
var newSecretToken = Guid.NewGuid().ToString(); var newSecretToken = Guid.NewGuid().ToString();
var (newRefreshTokenHash, newRefreshTokenSalt) = PasswordHasher.HashPassword(newSecretToken); var (newRefreshTokenHash, newRefreshTokenSalt) = PasswordHasher.HashPassword(newSecretToken);
@@ -340,7 +342,7 @@ public class AuthController : BaseController
Message = "Token refreshed successfully.", Message = "Token refreshed successfully.",
Data = new TokenRefreshResponse Data = new TokenRefreshResponse
{ {
Jwt = newJwtToken, Jwt = newJwt,
NewRefreshToken = fullNewRefreshToken, NewRefreshToken = fullNewRefreshToken,
JwtExpiresIn = jwtExpiresIn JwtExpiresIn = jwtExpiresIn
} }
@@ -362,8 +364,8 @@ public class AuthController : BaseController
}); });
} }
var (userId, error) = GetUserIdFromClaims(); var (userId, _, _, _, claimsError) = GetProgramUserFromClaims();
if (error != null) return error; if (claimsError != null) return claimsError;
var dotIndex = logoutDto.RefreshToken.IndexOf('.'); var dotIndex = logoutDto.RefreshToken.IndexOf('.');
if (dotIndex < 1 || !Guid.TryParse(logoutDto.RefreshToken[..dotIndex], out Guid tokenId)) if (dotIndex < 1 || !Guid.TryParse(logoutDto.RefreshToken[..dotIndex], out Guid tokenId))