using Kdbndp.TypeHandlers; using Microsoft.IdentityModel.Tokens; using ReZero.Configuration; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; namespace ReZero.SuperAPI { public partial class MethodApi { public DateTime? TokenExpiration { get; set; } /// /// 获取JWT Token /// /// 用户名 /// 密码 /// JWT Token字符串 public string GetToken(string userName, string password) { var db = App.Db; var options = SuperAPIModule._apiOptions; var jwt = options?.InterfaceOptions?.Jwt ?? new Configuration.ReZeroJwt(); ZeroUserInfo data = GetAdminUserInfo(userName, password, db); if (data != null && string.IsNullOrEmpty(data.BusinessAccount)) { return GenerateJwtToken(data, jwt); } else if (data != null&& !string.IsNullOrEmpty(data.BusinessAccount)) { var dt = db.Queryable() .AS(jwt.UserTableName) .Where(jwt.UserNameFieldName, "=", data.BusinessAccount) .ToDataTable(); if (dt.Rows.Count == 0) { throw new Exception(TextHandler.GetCommonText("授权失败", "Authorization failure")); } return GenerateJwtToken(dt.Rows[0], jwt); } else //业务表登录 { CheckJwt(jwt); DataTable dt = new DataTable(); try { dt = db.Queryable() .AS(jwt.UserTableName) .Where(jwt.PasswordFieldName, "=", password) .Where(jwt.UserNameFieldName, "=", userName) .ToDataTable(); } catch (Exception) { throw new Exception(TextHandler.GetCommonText("授权失败", "Authorization failure")); } if (dt.Rows.Count == 0) { throw new Exception(TextHandler.GetCommonText("授权失败", "Authorization failure")); } return GenerateJwtToken(dt.Rows[0], jwt); } } /// /// 获取管理员用户信息 /// /// 用户名 /// 密码 /// 数据库连接 /// 管理员用户信息 private static ZeroUserInfo GetAdminUserInfo(string userName, string password, ISqlSugarClient db) { // 先验证是不是系统管理员账号 return db.Queryable() .Where(it => it.UserName == userName) .Where(it => it.Password == password).First(); } /// /// 检查JWT配置 /// /// JWT配置 private static void CheckJwt(ReZeroJwt jwt) { if (string.IsNullOrEmpty(jwt.Secret) || string.IsNullOrEmpty(jwt.UserTableName) || string.IsNullOrEmpty(jwt.UserTableName) || string.IsNullOrEmpty(jwt.UserTableName)) { throw new Exception(TextHandler.GetCommonText("请到json文件配置jwt信息", "Go to the json file to configure the jwt information")); } } /// /// 生成JWT Token /// /// 用户信息 /// JWT配置 /// JWT Token字符串 private string GenerateJwtToken(ZeroUserInfo user, ReZeroJwt jwt) { var options = SuperAPIModule._apiOptions; var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(jwt.Secret); var claims = new List(); claims.Add(new Claim(ClaimTypes.Name, user.UserName)); foreach (var claim in jwt.Claim ?? new List()) { claims.Add(new Claim(claim.Key, user.GetType().GetProperty(claim.FieldName)?.GetValue(user, null)?.ToString() ?? "")); } var tokenExpiration = this.TokenExpiration; if (tokenExpiration == null) { tokenExpiration = DateTime.UtcNow.AddMinutes(jwt?.Expires ?? 1000); } var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims.ToArray()), Expires = tokenExpiration, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } /// /// 生成JWT Token /// /// 用户信息 /// JWT配置 /// JWT Token字符串 private string GenerateJwtToken(DataRow user, ReZeroJwt jwt) { var options = SuperAPIModule._apiOptions; var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(jwt.Secret); var claims = new List(); claims.Add(new Claim(ClaimTypes.Name, user[jwt.UserNameFieldName] + "")); foreach (var claim in jwt.Claim ?? new List()) { claims.Add(new Claim(claim.Key, user[claim.FieldName] + "")); } var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims.ToArray()), Expires = DateTime.UtcNow.AddMinutes(jwt?.Expires ?? 1000), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } } }