1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Threading.Tasks;
5 namespace ZRFCoreTestMongoDB.Commoms
6 {
7 using Microsoft.AspNetCore.Http;
8 using Microsoft.IdentityModel.Tokens;
9 using System.IdentityModel.Tokens.Jwt;
10 using System.Security.Claims;
11 using System.Text;
12 using ZRFCoreTestMongoDB.Model;
13
14 /// <summary>
15 /// @auth fengge
16 /// </summary>
17 public class ZrfJwtHelper
18 {
19/// <summary>
20/// 生成Tocken
21/// </summary>
22/// <param name="p"></param>
23/// <returns></returns>
24public static string GetTocken(personnel p)
25 {
26 //读取配置文件获得Jwt的json文件信息
27 var model = AppJsonHelper.InitJsonModel();
28 string _issuer = model.Issuer;//分发者
29 string audience = model.Audience;//接受者
30 string TockenSecrete = model.TockenSecrete;//秘钥
31
32 //秘钥
33 var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TockenSecrete)), SecurityAlgorithms.HmacSha256);
34 // 設定要加入到 JWT Token 中的聲明資訊(Claims)
35 //var claims = new List<Claim>();
36 //// 在 RFC 7519 規格中(Section#4),總共定義了 7 個預設的 Claims,我們應該只用的到兩種!
37 ////claims.Add(new Claim(JwtRegisteredClaimNames.Iss, issuer));
38 //claims.Add(new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserId));
39
40 //Claim
41 var claims = new Claim[] {
42new Claim(JwtRegisteredClaimNames.Sid,p.Uid),
43new Claim(JwtRegisteredClaimNames.Iss,_issuer),
44new Claim(JwtRegisteredClaimNames.Sub,p.Name),
45new Claim("Guid",Guid.NewGuid().ToString("D")),
46new Claim("Roleid",p.Roleid.ToString()),
47new Claim("Age",p.Age.ToString()),
48new Claim("BirthDay",p.BirthDay.ToString())
49 };
50
51 SecurityToken securityToken = new JwtSecurityToken(
52 issuer: _issuer,
53 audience: audience,
54 signingCredentials: securityKey,
55 expires: DateTime.Now.AddMinutes(2),//过期时间
56 claims: claims
57 );
58
59 return new JwtSecurityTokenHandler().WriteToken(securityToken);
60 }
61
62/// <summary>
63/// 获取accessTocken
64/// </summary>
65/// <param name="context"></param>
66/// <returns></returns>
67public static string GetTockenString(HttpContext context)
68 {
69 return context != null ? context.Request.Headers["Authorization"].ToString() : "";
70 }
71
72/// <summary>
73/// 解析Jwt生成的 Tocken
74/// </summary>
75/// <param name="accesTocken"></param>
76/// <returns></returns>
77public static TockenInfo GetTockenInfo(string accesTocken)
78 {
79 try
80 {
81 if (accesTocken.Contains("Bearer")) //防止前端传过来的tocken 为待了 Bearer 的字符串
82 {
83accesTocken = accesTocken.Replace("Bearer ", "");
84 }
85 var tockHandler = new JwtSecurityToken(accesTocken);
86 TockenInfo info = new TockenInfo
87 {
88// Age=tockHandler.Claims.FirstOrDefault(c=>c.Type==JwtRegisteredClaimNames.Email)
89U => c.Type == JwtRegisteredClaimNames.Sid).Value,
90Name = tockHandler.Claims.FirstOrDefault(c => c.Type ==JwtRegisteredClaimNames.Sub).Value,//在于自己来定义了,上面生成是和下面获取时Key要一致
91
92Age = tockHandler.Claims.FirstOrDefault(c => c.Type == "Age").Value,
93BirthDay = tockHandler.Claims.FirstOrDefault(c => c.Type == "BirthDay").Value,
94Role => c.Type == "Roleid").Value,
95 };
96 return info;
97 }
98 catch (Exception ex)
99 {
100 throw new Exception("解析Tocken时错误!");
101 }
102 }
103 }
104 public class TockenInfo
105 {
106public string Uid { get; set; }
107public string Name { get; set; }
108public string Age { get; set; }
109public string BirthDay { get; set; }
110public string Roleid { get; set; }
111 }
112 }