You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					122 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					122 lines
				
				4.4 KiB
			| 
											6 months ago
										 | using Microsoft.AspNetCore.Http;
 | ||
|  | using Microsoft.Extensions.Configuration;
 | ||
|  | using Microsoft.Extensions.DependencyInjection;
 | ||
|  | using Microsoft.Extensions.Logging;
 | ||
|  | using ReZero.SuperAPI;
 | ||
|  | using System;
 | ||
|  | using System.Collections.Generic;
 | ||
|  | using System.IdentityModel.Tokens.Jwt;
 | ||
|  | using System.Linq;
 | ||
|  | using System.Security.Claims;
 | ||
|  | using System.Text;
 | ||
|  | 
 | ||
|  | namespace ReZero.DependencyInjection
 | ||
|  | {
 | ||
|  |     public class DependencyResolver
 | ||
|  |     {
 | ||
|  |         public static ServiceProvider Provider { get => ServiceLocator.Services!.BuildServiceProvider(); }
 | ||
|  |         public static IHttpContextAccessor? httpContextAccessor = null;
 | ||
|  |         public static ILogger<SuperAPIMiddleware>? logger = null;
 | ||
|  |         public static T GetService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             return Provider!.GetService<T>();
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         public static ILogger<SuperAPIMiddleware> GetLogger() 
 | ||
|  |         {
 | ||
|  |             if (logger == null) 
 | ||
|  |             {
 | ||
|  |                 logger = ReZero.DependencyInjection.DependencyResolver.GetService<ILogger<SuperAPIMiddleware>>();
 | ||
|  |             }
 | ||
|  |             return logger;
 | ||
|  |         }
 | ||
|  |         public static ClaimsPrincipal GetClaims()
 | ||
|  |         {
 | ||
|  |             if (httpContextAccessor == null)
 | ||
|  |             {
 | ||
|  |                 if (Provider!.GetService<IHttpContextAccessor>()?.HttpContext == null)
 | ||
|  |                 {
 | ||
|  |                     throw new Exception("Requires builder.Services.AddHttpContextAccessor()");
 | ||
|  |                 }
 | ||
|  |                 httpContextAccessor = Provider!.GetService<IHttpContextAccessor>();
 | ||
|  |             }
 | ||
|  |             HttpContext httpContext = httpContextAccessor!.HttpContext;
 | ||
|  |             var authHeader = httpContext.Request.Headers["Authorization"].FirstOrDefault();
 | ||
|  | 
 | ||
|  |             if (authHeader != null && authHeader.StartsWith("Bearer "))
 | ||
|  |             {
 | ||
|  |                 var token = authHeader.Substring("Bearer ".Length).Trim();
 | ||
|  |                 var handler = new JwtSecurityTokenHandler();
 | ||
|  | 
 | ||
|  |                 try
 | ||
|  |                 {
 | ||
|  |                     var jwtToken = handler.ReadJwtToken(token);
 | ||
|  |                     var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(jwtToken.Claims));
 | ||
|  |                     return claimsPrincipal;
 | ||
|  |                 }
 | ||
|  |                 catch (Exception)
 | ||
|  |                 {
 | ||
|  |                     // Handle token parsing error
 | ||
|  |                     return null;
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  | 
 | ||
|  |             return null;
 | ||
|  |         }
 | ||
|  |         public static T GetHttpContextService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             if (httpContextAccessor == null)
 | ||
|  |             {
 | ||
|  |                 if (Provider!.GetService<IHttpContextAccessor>()?.HttpContext == null)
 | ||
|  |                 {
 | ||
|  |                     throw new Exception("Requires builder.Services.AddHttpContextAccessor()");
 | ||
|  |                 }
 | ||
|  |                 httpContextAccessor = Provider!.GetService<IHttpContextAccessor>();
 | ||
|  |             }
 | ||
|  |             return httpContextAccessor!.HttpContext!.RequestServices!.GetService<T>();
 | ||
|  |         }
 | ||
|  |         public static T GetHttpContextRequiredService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             if (httpContextAccessor == null)
 | ||
|  |             {
 | ||
|  |                 if (Provider!.GetService<IHttpContextAccessor>()?.HttpContext == null)
 | ||
|  |                 {
 | ||
|  |                     throw new Exception("Requires builder.Services.AddHttpContextAccessor()");
 | ||
|  |                 }
 | ||
|  |                 httpContextAccessor = Provider!.GetService<IHttpContextAccessor>();
 | ||
|  |             }
 | ||
|  |             return httpContextAccessor!.HttpContext!.RequestServices!.GetRequiredService<T>();
 | ||
|  |         }
 | ||
|  |         public static T GetRequiredService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             return Provider?.GetRequiredService<T>();
 | ||
|  |         }
 | ||
|  |         public static T GetNewService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             using var scope = Provider?.CreateScope();
 | ||
|  |             return scope?.ServiceProvider?.GetService<T>();
 | ||
|  |         }
 | ||
|  |         public static T GetNewRequiredService<T>() where T : class
 | ||
|  |         {
 | ||
|  |             using var scope = Provider?.CreateScope();
 | ||
|  |             return scope?.ServiceProvider?.GetRequiredService<T>();
 | ||
|  |         }
 | ||
|  |         public static string GetLoggedInUser()
 | ||
|  |         {
 | ||
|  |             var claimsPrincipal = GetClaims();
 | ||
|  |             if (claimsPrincipal == null)
 | ||
|  |             {
 | ||
|  |                 return null;
 | ||
|  |             }
 | ||
|  | 
 | ||
|  |             var usernameClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "unique_name");
 | ||
|  |             if (usernameClaim == null)
 | ||
|  |             {
 | ||
|  |                 return  null;
 | ||
|  |             }
 | ||
|  | 
 | ||
|  |             return usernameClaim.Value; ;
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | }
 |