JwtAuth.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Microsoft.IdentityModel.Tokens;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IdentityModel.Tokens.Jwt;
  5. using System.Text;
  6. using TEAMModelOS.SDK.Models.Cosmos.BI;
  7. namespace TEAMModelBI.Models.Extension
  8. {
  9. public static class JwtAuth
  10. {
  11. /// <summary>
  12. /// BI AuthToken
  13. /// </summary>
  14. /// <param name="issuser">站点</param>
  15. /// <param name="id">醍摩豆ID</param>
  16. /// <param name="name">醍摩豆名称</param>
  17. /// <param name="picture">醍摩豆头像</param>
  18. /// <param name="salt">秘钥</param>
  19. /// <param name="scope">范围</param>
  20. /// <param name="Website">平台</param>
  21. /// <param name="isExploit">是否是工程模式</param>
  22. /// <param name="did">钉钉Id</param>
  23. /// <param name="dname">钉钉名称</param>
  24. /// <param name="dpicture">钉钉头像</param>
  25. /// <param name="roles">角色</param>
  26. /// <param name="permissions">权限</param>
  27. /// <param name="expire">到期时间</param>
  28. /// <returns></returns>
  29. public static string CreateAuthTokenBI(string issuser, string id, string name, string picture, string salt, string scope, string webSite, bool isex = false, string did = null, string dname = null, string dpicture = null, string[] roles = null, string[] permissions = null, int expire = 1)
  30. {
  31. var payload = new JwtPayload
  32. {
  33. { JwtRegisteredClaimNames.Iss,issuser}, //发行者
  34. { JwtRegisteredClaimNames.Sub,id}, //用户ID
  35. { JwtRegisteredClaimNames.Azp,isex}, //是否是开发部的
  36. { JwtRegisteredClaimNames.Exp,DateTimeOffset.UtcNow.AddHours(expire).ToUnixTimeSeconds().ToString()},//到期时间
  37. { "name",name},//用户显示名称
  38. { "picture",picture}, // 用户头像
  39. { "roles",roles}, //登陆者的角色, (admin、assist)
  40. { "permissions",permissions}, //登陆者的权限
  41. { "ddsub",did } , //登陆者的钉钉用户id
  42. { "ddname",dname } , //登陆者的钉钉用户名称
  43. { "ddpicture",dpicture }, //登陆者的钉钉用户头像
  44. { "scope",scope}, //
  45. { JwtRegisteredClaimNames.Website,webSite}, // 平台站点
  46. };
  47. // 建立加密的秘钥
  48. var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt));
  49. // HmacSha256 有要求必须要大于 128 bits,所以 salt 不能太短,至少要 16 字元以上
  50. // https://stackoverflow.com/questions/47279947/idx10603-the-algorithm-hs256-requires-the-securitykey-keysize-to-be-greater
  51. //var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
  52. var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
  53. var header = new JwtHeader(signingCredentials);
  54. var secToken = new JwtSecurityToken(header, payload);
  55. // 產出所需要的 JWT securityToken 物件,並取得序列化後的 Token 結果(字串格式)
  56. var tokenHandler = new JwtSecurityTokenHandler();
  57. //var securityToken = tokenHandler.CreateToken(tokenDescriptor);
  58. var serializeToken = tokenHandler.WriteToken(secToken);
  59. return serializeToken;
  60. }
  61. /// <summary>
  62. /// 应用审核后生成的JwtKey秘钥
  63. /// </summary>
  64. /// <param name="issuser">站点</param>
  65. /// <param name="salt">加密秘钥</param>
  66. /// <param name="appCompany">应用信息</param>
  67. /// <returns></returns>
  68. public static string CreateApplyJwtKeyBI(string issuser, string salt, AppCompany appCompany)
  69. {
  70. var payload = new JwtPayload
  71. {
  72. { JwtRegisteredClaimNames.Iss,issuser}, //发布站点
  73. { JwtRegisteredClaimNames.Sub,appCompany.id}, //应用ID
  74. { JwtRegisteredClaimNames.Aud,appCompany.code}, //应用Code
  75. { JwtRegisteredClaimNames.Iat,DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()}, //秘钥发布时间
  76. { JwtRegisteredClaimNames.Exp,appCompany.expiresTime}, //应用到期时间
  77. { JwtRegisteredClaimNames.Azp,appCompany.pk}, //企业pk
  78. { "name",appCompany.name}, //应用名称
  79. { "type",appCompany.type}, //类型 1应用类型
  80. { "picture",appCompany.picture}, //应用头像
  81. { "status",appCompany.status}, //应用状态 -1内测中,0已下架,1已上架
  82. { "audit",appCompany.audit}, //应用审核状态
  83. { "gateways",appCompany.gateways}, //应用的回调网关
  84. { "apis",appCompany.apis}, //开放接口申请状态
  85. { "webhook",appCompany.webhookDomain}, //企业默认的通知回调地址
  86. { "webHooks",appCompany.webHooks}, //开放平台 通知回调地址
  87. {"schools",appCompany.schools }, //开放学校
  88. };
  89. // 建立加密的秘钥
  90. var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt));
  91. // HmacSha256 有要求必须要大于 128 bits,所以 salt 不能太短,至少要 16 字元以上
  92. // https://stackoverflow.com/questions/47279947/idx10603-the-algorithm-hs256-requires-the-securitykey-keysize-to-be-greater
  93. //var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
  94. var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
  95. var header = new JwtHeader(signingCredentials);
  96. var secToken = new JwtSecurityToken(header, payload);
  97. // 产出所需要的 JWT securityToken 物件,并取得序列化后的 Token 结果(字串格式)
  98. var tokenHandler = new JwtSecurityTokenHandler();
  99. //var securityToken = tokenHandler.CreateToken(tokenDescriptor);
  100. var serializeToken = tokenHandler.WriteToken(secToken);
  101. return serializeToken;
  102. }
  103. }
  104. }