Merge branch 'develop' into dev
This commit is contained in:
commit
bd2723f47b
1 changed files with 58 additions and 20 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Nest;
|
using Nest;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
@ -29,6 +30,49 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
|
||||||
SystemName = "recruiting";
|
SystemName = "recruiting";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// แกะ JWT token เพื่อดึง claims ต่างๆ
|
||||||
|
/// </summary>
|
||||||
|
private JwtSecurityToken? ParseToken(string token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var tokenHandler = new JwtSecurityTokenHandler();
|
||||||
|
var jwtToken = tokenHandler.ReadJwtToken(token.Replace("Bearer ", ""));
|
||||||
|
return jwtToken;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ดึงค่า claim จาก token โดยลองชื่อหลายแบบ
|
||||||
|
/// </summary>
|
||||||
|
private string? GetClaimValue(JwtSecurityToken? token, params string[] claimNames)
|
||||||
|
{
|
||||||
|
if (token == null) return null;
|
||||||
|
|
||||||
|
foreach (var name in claimNames)
|
||||||
|
{
|
||||||
|
var claim = token.Claims.FirstOrDefault(c => c.Type == name);
|
||||||
|
if (claim != null)
|
||||||
|
return claim.Value;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ดึงค่า Guid claim จาก token
|
||||||
|
/// </summary>
|
||||||
|
private Guid? GetGuidClaim(JwtSecurityToken? token, params string[] claimNames)
|
||||||
|
{
|
||||||
|
var value = GetClaimValue(token, claimNames);
|
||||||
|
if (Guid.TryParse(value, out var guid))
|
||||||
|
return guid;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task Invoke(HttpContext context)
|
public async Task Invoke(HttpContext context)
|
||||||
{
|
{
|
||||||
|
|
@ -92,28 +136,22 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
|
||||||
// เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้
|
// เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้
|
||||||
context.Response.Body = memoryStream;
|
context.Response.Body = memoryStream;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Extract all required data from JWT token claims
|
|
||||||
var keycloakId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? Guid.Empty.ToString("D");
|
var keycloakId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? Guid.Empty.ToString("D");
|
||||||
|
var tokenHeader = context.Request.Headers["Authorization"].ToString();
|
||||||
|
|
||||||
var prefix = context.User?.FindFirst("prefix")?.Value;
|
// แกะ JWT token เพื่อดึง claims ต่างๆ
|
||||||
var firstName = context.User?.FindFirst("given_name")?.Value;
|
var jwtToken = ParseToken(tokenHeader);
|
||||||
var lastName = context.User?.FindFirst("family_name")?.Value;
|
|
||||||
var preferredUsername = context.User?.FindFirst("preferred_username")?.Value;
|
|
||||||
|
|
||||||
var orgRootDnaId = context.User?.FindFirst("orgRootDnaId")?.Value;
|
// ดึงข้อมูลจาก claims โดยลองชื่อหลายแบบ (camelCase, snake_case, ฯลฯ)
|
||||||
var orgChild1DnaId = context.User?.FindFirst("orgChild1DnaId")?.Value;
|
var prefix = GetClaimValue(jwtToken, "prefix", "Prefix", "PREFIX");
|
||||||
var orgChild2DnaId = context.User?.FindFirst("orgChild2DnaId")?.Value;
|
var firstName = GetClaimValue(jwtToken, "given_name", "firstname", "firstName", "FirstName", "FIRSTNAME");
|
||||||
var orgChild3DnaId = context.User?.FindFirst("orgChild3DnaId")?.Value;
|
var lastName = GetClaimValue(jwtToken, "family_name", "lastname", "lastName", "LastName", "LASTNAME");
|
||||||
var orgChild4DnaId = context.User?.FindFirst("orgChild4DnaId")?.Value;
|
var preferredUsername = GetClaimValue(jwtToken, "preferred_username", "preferred_username", "PreferredUsername");
|
||||||
|
var orgRootDnaId = GetGuidClaim(jwtToken, "orgRootDnaId", "org_root_dna_id", "OrgRootDnaId", "rootDnaId");
|
||||||
// Parse Guid values safely
|
var orgChild1DnaId = GetGuidClaim(jwtToken, "orgChild1DnaId", "org_child1_dna", "OrgChild1Dna", "child1DnaId");
|
||||||
Guid? rootDnaId = Guid.TryParse(orgRootDnaId, out var rid) ? rid : null;
|
var orgChild2DnaId = GetGuidClaim(jwtToken, "orgChild2DnaId", "org_child2_dna", "OrgChild2Dna", "child2DnaId");
|
||||||
Guid? child1DnaId = Guid.TryParse(orgChild1DnaId, out var c1) ? c1 : null;
|
var orgChild3DnaId = GetGuidClaim(jwtToken, "orgChild3DnaId", "org_child3_dna", "OrgChild3Dna", "child3DnaId");
|
||||||
Guid? child2DnaId = Guid.TryParse(orgChild2DnaId, out var c2) ? c2 : null;
|
var orgChild4DnaId = GetGuidClaim(jwtToken, "orgChild4DnaId", "org_child4_dna", "OrgChild4Dna", "child4DnaId");
|
||||||
Guid? child3DnaId = Guid.TryParse(orgChild3DnaId, out var c3) ? c3 : null;
|
|
||||||
Guid? child4DnaId = Guid.TryParse(orgChild4DnaId, out var c4) ? c4 : null;
|
|
||||||
|
|
||||||
await _next(context); // ดำเนินการต่อไปยัง Middleware อื่น ๆ
|
await _next(context); // ดำเนินการต่อไปยัง Middleware อื่น ๆ
|
||||||
|
|
||||||
|
|
@ -200,7 +238,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
|
||||||
{
|
{
|
||||||
logType = logType,
|
logType = logType,
|
||||||
ip = context.Connection.RemoteIpAddress?.ToString(),
|
ip = context.Connection.RemoteIpAddress?.ToString(),
|
||||||
rootId = rootDnaId,
|
rootId = orgRootDnaId?.ToString("D"),
|
||||||
systemName = SystemName,
|
systemName = SystemName,
|
||||||
startTimeStamp = startTime.ToString("o"),
|
startTimeStamp = startTime.ToString("o"),
|
||||||
endTimeStamp = endTime.ToString("o"),
|
endTimeStamp = endTime.ToString("o"),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue