Files
zszq-trs/Framework/SharedWebApi/AspNetCustom/LoadUserMiddleware.cs
T
2024-05-09 14:06:26 +08:00

81 lines
2.5 KiB
C#

using DocumentFormat.OpenXml.Spreadsheet;
using System.Security.Principal;
using YLErp;
namespace YLWebAPI.ApiModule
{
public class LoadUserMiddleware
{
readonly RequestDelegate next;
public LoadUserMiddleware(RequestDelegate next)
{
this.next = next;
}
/// <summary>
/// 请求拦截处理
/// </summary>
/// <param name="context">HTTP请求</param>
/// <returns></returns>
public async Task InvokeAsync(HttpContext context)
{
if (context.User.Identity?.IsAuthenticated == true)
{
var clientId = GetValueFromClaims(context, "clientId");
_ = int.TryParse(GetValueFromClaims(context, "userId"), out int userId);
var userName = GetValueFromClaims(context, "userName");
var userGroup = GetValueFromClaims(context, "userGroup");
context.Items["ClientId"] = clientId;
var userinfo = new AuthUserInfo(userId, userName, userGroup)
{
IpAddress = GetClientIpAddress(context)
};
context.User = new GenericPrincipal(userinfo, null);
}
await next(context);
}
private static string GetValueFromClaims(HttpContext context, string claimKey)
{
var claim = context.User.FindFirst(claimKey);
if (claim != null)
{
return claim.Value;
}
return string.Empty;
}
private static string GetClientIpAddress(HttpContext context)
{
return context.Connection.RemoteIpAddress?.ToString() + context.Connection.RemotePort;
}
public class AuthUserInfo : OptUserInfo, IIdentity
{
/// <summary>
/// 用户名
/// </summary>
public string Name => UserName;
public string AuthenticationType => "JWT";
public bool IsAuthenticated => true;
public AuthUserInfo(int userId, string userName, string userGroup)
: base(userId, userName, OptUserFrom.WebAPI, userGroup)
{
}
public string CreateJwtToken()
{
var identity = UserManager.CreateIdentity(UserId.ToString(), UserName, AuthHelper.JwtUserToken);
var jwtToken = AuthHelper.CreateJwtToken(identity);
return jwtToken;
}
}
}
}