| | |
| | | using Furion; |
| | | using Azure.Core; |
| | | using Furion; |
| | | using Furion.DatabaseAccessor; |
| | | using Furion.DataEncryption; |
| | | using Furion.FriendlyException; |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.EntityFrameworkCore; |
| | | using Microsoft.Extensions.Options; |
| | | using Microsoft.IdentityModel.Tokens; |
| | | using Newtonsoft.Json; |
| | |
| | | logier.RefreshToken = JWTEncryption.GenerateRefreshToken(logier.AccessToken, 60 * 24); |
| | | |
| | | // 设置响应报文头 |
| | | httpContextAccessor.HttpContext.Response.Headers["access-token"] = logier.AccessToken; |
| | | httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = logier.RefreshToken; |
| | | if (httpContextAccessor.HttpContext != null) |
| | | { |
| | | httpContextAccessor.HttpContext.Response.Headers["access-token"] = logier.AccessToken; |
| | | httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = logier.RefreshToken; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前登录用户 |
| | | /// </summary> |
| | | /// <param name="user"></param> |
| | | /// <param name="clientType"></param> |
| | | /// <param name="session_key"></param> |
| | | /// <returns></returns> |
| | | public static LoginCommandCallback GetCurrentLogier(this User user, EnumClientType clientType, string session_key = null) |
| | | { |
| | | var logier = new CurrentLogier |
| | | { |
| | | Id = user.Id, |
| | | Avatar = user.Avatar, |
| | | Name = user.Name, |
| | | UserName = user.UserName, |
| | | PhoneNumber = user.PhoneNumber, |
| | | Level = user.Level, |
| | | Type = user.Type, |
| | | ClientType = clientType, |
| | | EnterpriseId = user.EnterpriseId, |
| | | }; |
| | | GenerateToken(logier); |
| | | |
| | | return new LoginCommandCallback |
| | | { |
| | | Id = logier.Id, |
| | | AccessToken = logier.AccessToken, |
| | | RefreshToken = logier.RefreshToken, |
| | | SessionKey = session_key, |
| | | IsBindPhoneNumber = logier.PhoneNumber.IsNotNull() |
| | | }; |
| | | } |
| | | |
| | | public static async Task<LoginCommandCallback> GetCurrentLogier(this string accessToken) |
| | | { |
| | | if (accessToken.IsNotNull()) |
| | | { |
| | | var claims = JWTEncryption.ReadJwtToken(accessToken)?.Claims; |
| | | if (claims != null) |
| | | { |
| | | var claimIdentity = new ClaimsIdentity("AuthenticationTypes.Federation"); |
| | | claimIdentity.AddClaims(claims); |
| | | var claimsPrincipal = new ClaimsPrincipal(claimIdentity); |
| | | var userId = claimsPrincipal.FindFirstValue("Id").ToGuid(); |
| | | var clientType = claimsPrincipal.FindFirstValue("ClientType").ToEnum<EnumClientType>(); |
| | | if (userId.HasValue && clientType.HasValue) |
| | | { |
| | | var user = await Db.GetRepository<User>().AsQueryable().AsNoTracking() |
| | | .Where(it => it.Id == userId) |
| | | .FirstOrDefaultAsync(); |
| | | if (user != null) |
| | | { |
| | | var logier = user.GetCurrentLogier(clientType.Value); |
| | | return logier; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |