using System.Security.Claims;
using Fake.AspNetCore.Authentication;
using Fake.DependencyInjection;
using Fake.Rbac.Application.Jwt;
using Fake.Rbac.Application.Services;
using Fake.Rbac.Infrastructure;
using Fake.Security.Claims;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Oms.Application;
namespace SimpleAdmin.Api;
///
/// 自定义simple-admin auth jwt service
///
[Dependency(Replace = true)]
public class SimpleJwtService(IOptions jwtOptions, UserService userService, FakeRbacDbContext rbacDbContext)
: JwtService(jwtOptions, userService)
{
public override async Task> GenerateClaimsByUserIdAsync(Guid userId,
CancellationToken cancellationToken)
{
var claims = await base.GenerateClaimsByUserIdAsync(userId, cancellationToken);
var sql = $"select `userid` as `Value` from `{FakeTables.User}` where `Id` = {{0}}";
var mapId = await rbacDbContext.Database.SqlQueryRaw(sql, userId)
.FirstOrDefaultAsync(cancellationToken);
if (mapId.HasValue)
{
claims.RemoveAll(x => x.Type == FakeClaimTypes.UserId);
claims.Add(new Claim(FakeClaimTypes.UserId, mapId.Value.ToString()));
claims.Add(new Claim(ClaimTypes.NameIdentifier, userId.ToString()));
}
return claims;
}
}