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
3 weeks 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; ;
|
||
|
}
|
||
|
}
|
||
|
}
|