using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.Const;
using WIDESEAWCS_Core.DB;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Seed;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Core.HttpContextUser
{
public class AspNetUser : IUser
{
private readonly IHttpContextAccessor _accessor;
private readonly ICacheService _cacheService;
//private readonly ILogger<AspNetUser> _logger;
public AspNetUser(IHttpContextAccessor accessor, ICacheService cacheService)
{
_accessor = accessor;
_cacheService = cacheService;
/*_logger = logger;*/
}
public string UserName => GetUserInfoFromToken(ClaimTypes.Name).FirstOrDefault() ?? "";
public int UserId => GetClaimValueByType(JwtRegisteredClaimNames.Jti) == null ? 0 : GetClaimValueByType(JwtRegisteredClaimNames.Jti).FirstOrDefault()?.ObjToInt() ?? 0;
public long TenantId => GetUserInfoFromToken(nameof(TenantId)).FirstOrDefault()?.ObjToLong() ?? -1;
public int RoleId => GetUserInfoFromToken(ClaimTypes.Role).FirstOrDefault()?.ObjToInt() ?? 0;
public string Token => GetToken();
public int MenuType => (_accessor.HttpContext?.Request.Headers.ContainsKey("uniapp") ?? false) ? 1 : 0;
public bool IsAuthenticated()
{
return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false;
}
public string GetToken()
{
string token = _cacheService.Get(UserId.ToString());
if (!string.IsNullOrEmpty(token)) { return token; }
return string.Empty;
//return _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "") ?? "";
}
public void UpdateToke(string token)
{
_cacheService.AddOrUpdate(UserId.ToString(), token);
}
public bool IsSuperAdmin => IsRoleIdSuperAdmin(RoleId);
public List<string> GetUserInfoFromToken(string ClaimType)
{
var jwtHandler = new JwtSecurityTokenHandler();
var token = "";
token = GetToken();
// tokenæ ¡éªŒ
if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
{
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token);
return (from item in jwtToken.Claims
where item.Type == ClaimType
select item.Value).ToList();
}
return new List<string>() { };
}
public IEnumerable<Claim> GetClaimsIdentity()
{
if (_accessor.HttpContext != null)
{
var claims = _accessor.HttpContext.User.Claims.ToList();
var headers = _accessor.HttpContext.Request.Headers;
foreach (var header in headers)
{
claims.Add(new Claim(header.Key, header.Value));
}
return claims;
}
return ArraySegment<Claim>.Empty;
}
public List<string> GetClaimValueByType(string ClaimType)
{
return (from item in GetClaimsIdentity()
where item.Type == ClaimType
select item.Value).ToList();
}
public bool IsRoleIdSuperAdmin(int roleId)
{
return roleId == 1;
}
}
public class UserInfo
{
public long TenantId { get; set; }
public int RoleId { get; set; }
public string UserName { get; set; }
public int UserId { get; set; }
public string UserTrueName { get; set; }
public string HeadImageUrl { get; set; }
/// <summary>
/// 使用下é¢çš„DeptIdså—æ®µ
/// </summary>
[Obsolete]
public int DeptId { get; set; }
public List<Guid> DeptIds { get; set; }
public string Token { get; set; }
public string Token_ID { get; set; }
}
}