sunpengfei
7 天以前 eb358f8a46f4264a7ba88a5624edf3ae5b4ad983
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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;
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;
 
namespace FlexJobApi.Core
{
    public static class JwtUtils
    {
        /// <summary>
        /// 生成用户令牌
        /// </summary>
        /// <param name="logier"></param>
        /// <returns></returns>
        public static void GenerateToken(this CurrentLogier logier)
        {
            var httpContextAccessor = App.GetService<IHttpContextAccessor>();
 
            // 生成 token
            logier.AccessToken = JWTEncryption.Encrypt(new Dictionary<string, object>()
            {
                { "Id", logier.Id },
                { "Avatar",logier.Avatar },
                { "Name",logier.Name },
                { "UserName",logier.UserName },
                { "PhoneNumber",logier.PhoneNumber },
                { "Level",logier.Level },
                { "Type",logier.Type },
                { "ClientType",logier.ClientType },
                { "EnterpriseId",logier.EnterpriseId },
            });
            // 获取刷新 token
            logier.RefreshToken = JWTEncryption.GenerateRefreshToken(logier.AccessToken, 60 * 24);
 
            // 设置响应报文头
            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())
            {
                accessToken = accessToken.Replace("Bearer ", null);
                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>
        /// 获取当前登录用户
        /// </summary>
        /// <returns></returns>
        public static CurrentLogier GetCurrentLogier()
        {
            if (App.User != null && App.User.Identity.IsAuthenticated)
            {
                var logier = new CurrentLogier();
                logier.Id = App.User.FindFirstValue("Id").ToGuid("缺失用户Id,请重新登录").Value;
                logier.Level = App.User.FindFirstValue("Level")?.ToInt() ?? 0;
                logier.Avatar = App.User.FindFirstValue("Avatar");
                logier.Name = App.User.FindFirstValue("Name");
                logier.UserName = App.User.FindFirstValue("UserName");
                logier.PhoneNumber = App.User.FindFirstValue("PhoneNumber");
                logier.Type = App.User.FindFirstValue("Type").ToEnum<EnumUserType>("缺失用户类型,请重新登录").Value;
                logier.ClientType = App.User.FindFirstValue("ClientType").ToEnum<EnumClientType>("缺失客户端类型,请重新登录").Value;
                logier.EnterpriseId = App.User.FindFirstValue("EnterpriseId").ToGuid();
                return logier;
            }
            return null;
        }
    }
}