بررسی — فایل: xIds/Providers/XApiKeyAuthenticationHandler.cs
توضیح:
Handler فعلی بهدرستی پیادهسازی شده است. فقط یک نکته مهم:
مطمئن شوید که ValidateApiKey در XApplicationProvider
مقدار requiredScope را بهدرستی بررسی میکند.
کد فعلی Handler (صحیح است):
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var apiKeyHeader = HeaderName;
if (!Request.Headers.ContainsKey(apiKeyHeader))
return AuthenticateResult.NoResult();
var apiKey = Request.Headers[apiKeyHeader].ToString();
if (apiKey.IsNullOrEmpty())
return AuthenticateResult.NoResult();
var clientIP = Request.HttpContext.Connection.RemoteIpAddress?.ToString();
var validationResult = await applicationProvider.ValidateApiKey(
apiKey: apiKey,
clientIP: clientIP
);
if (validationResult.Errors.HasChild())
{
var message = validationResult.Errors.ToListString('\n');
return AuthenticateResult.Fail(message);
}
var claims = new List<Claim> {
new(ClaimTypes.Name, validationResult.OwnerId),
new(JwtClaimTypes.Subject, validationResult.OwnerId),
new(XCustomClaims.ApplicationId, validationResult.ApplicationId.ToString()),
new(XCustomClaims.AuthType, "apikey"),
};
if (validationResult.Scopes != null)
{
foreach (var scope in validationResult.Scopes)
{
claims.Add(new Claim(JwtClaimTypes.Scope, scope));
}
}
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
✅ وضعیت Handler:
کد فعلی Handler صحیح است و نیازی به تغییر ندارد.
فقط مطمئن شوید که validationResult.Scopes مقادیر صحیح
(read, write, admin, manage)
را برمیگرداند.