From 347ecdfdc399a00dda8af579702df90739d35e4a Mon Sep 17 00:00:00 2001 From: Young Date: Sat, 12 Oct 2024 16:02:42 +0800 Subject: [PATCH] optimise usercontext --- .../Extensions/AuthenticationSetup.cs | 5 +++-- src/Infrastructure/Security/ITokenBuilder.cs | 22 +++++++++---------- src/Infrastructure/Security/IUserContext.cs | 8 +++---- .../JwtBearerOptionsPostConfigureOptions.cs | 2 +- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Infrastructure/Extensions/AuthenticationSetup.cs b/src/Infrastructure/Extensions/AuthenticationSetup.cs index 364d1b3..094ce74 100644 --- a/src/Infrastructure/Extensions/AuthenticationSetup.cs +++ b/src/Infrastructure/Extensions/AuthenticationSetup.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.IdentityModel.Tokens; +using NetTaste; namespace Infrastructure.Extensions; @@ -33,11 +34,11 @@ public static class AuthenticationSetup } services.TryAddSingleton(); - services.TryAddScoped(); + services.TryAddScoped(typeof(IUserContext<>), typeof(UserContextBase<>)); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton, JwtBearerOptionsPostConfigureOptions>(); - services.TryAddSingleton(); + services.TryAddSingleton(typeof(ITokenBuilder<>),typeof(TokenBuilderBase<>)); var key = configuration["AUDIENCE_KEY"] ?? audienceOptions.Secret; ArgumentException.ThrowIfNullOrEmpty(key); diff --git a/src/Infrastructure/Security/ITokenBuilder.cs b/src/Infrastructure/Security/ITokenBuilder.cs index 47a8996..6252712 100644 --- a/src/Infrastructure/Security/ITokenBuilder.cs +++ b/src/Infrastructure/Security/ITokenBuilder.cs @@ -3,32 +3,31 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using Infrastructure.Utils; using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; namespace Infrastructure.Security; -public interface ITokenBuilder +public interface ITokenBuilder where TId : IEquatable { - IList GetClaimsFromUserContext(IUserContext userContext); + IList GetClaimsFromUserContext(IUserContext userContext); void SetUserContext(TokenValidatedContext context); JwtTokenInfo GenerateJwtTokenInfo(IReadOnlyCollection claims); } -public class TokenBuilder( +public abstract class TokenBuilderBase( JwtOptions jwtOptions, JwtSecurityTokenHandler jwtSecurityTokenHandler, IEncryptionService encryptionService) - : ITokenBuilder + : ITokenBuilder where TId : IEquatable { - public IList GetClaimsFromUserContext(IUserContext userContext) + public IList GetClaimsFromUserContext(IUserContext userContext) { var claims = new List() { new(JwtRegisteredClaimNames.UniqueName, userContext.Username), - new(JwtRegisteredClaimNames.NameId, userContext.Id.ToString()), + new(JwtRegisteredClaimNames.NameId, userContext.Id.ToString() ?? string.Empty), new(JwtRegisteredClaimNames.Name, userContext.Name), new(JwtRegisteredClaimNames.Email, userContext.Email), new(JwtRegisteredClaimNames.Iat, @@ -42,11 +41,12 @@ public class TokenBuilder( public void SetUserContext(TokenValidatedContext context) { - var userContext = context.HttpContext.RequestServices.GetService() ?? - throw new NullReferenceException(nameof(IUserContext)); + var userContext = + context.HttpContext.RequestServices.GetService(typeof(IUserContext)) as IUserContext ?? + throw new NullReferenceException(nameof(IUserContext)); var principal = context.Principal ?? throw new NullReferenceException(nameof(context.Principal)); - userContext.Id = long.Parse( - principal.Claims.First(c => c.Type == JwtRegisteredClaimNames.NameId).Value); + var idClaim = principal.Claims.First(c => c.Type == JwtRegisteredClaimNames.NameId); + userContext.Id = (TId)Convert.ChangeType(idClaim.Value, typeof(TId)); userContext.Username = principal.Claims.First(c => c.Type == JwtRegisteredClaimNames.UniqueName).Value; userContext.Name = principal.Claims.First(c => c.Type == JwtRegisteredClaimNames.Name).Value; diff --git a/src/Infrastructure/Security/IUserContext.cs b/src/Infrastructure/Security/IUserContext.cs index d9bdff6..15f36fc 100644 --- a/src/Infrastructure/Security/IUserContext.cs +++ b/src/Infrastructure/Security/IUserContext.cs @@ -1,8 +1,8 @@ namespace Infrastructure.Security; -public interface IUserContext +public interface IUserContext where TId : IEquatable { - long Id { get; set; } + TId Id { get; set; } string Username { get; set; } @@ -15,9 +15,9 @@ public interface IUserContext string RemoteIpAddress { get; set; } } -public class UserContext : IUserContext +public abstract class UserContextBase : IUserContext where TId : IEquatable { - public long Id { get; set; } + public TId Id { get; set; } public string Username { get; set; } diff --git a/src/Infrastructure/Security/JwtBearerOptionsPostConfigureOptions.cs b/src/Infrastructure/Security/JwtBearerOptionsPostConfigureOptions.cs index f0e161b..715b2ce 100644 --- a/src/Infrastructure/Security/JwtBearerOptionsPostConfigureOptions.cs +++ b/src/Infrastructure/Security/JwtBearerOptionsPostConfigureOptions.cs @@ -4,7 +4,7 @@ namespace Infrastructure.Security; public class JwtBearerOptionsPostConfigureOptions( DefaultTokenHandler tokenHandler, - ITokenBuilder tokenBuilder) + ITokenBuilder tokenBuilder) : IPostConfigureOptions { public void PostConfigure(string? name, JwtBearerOptions options)