using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using wispro.sp.entity; using wispro.sp.share.webViewObject; namespace wispro.sp.api.Controllers { [Route("api/[controller]")] [ApiController] public class AccountController : ControllerBase { private static List CacheList = new List(); public IConfiguration Configuration { get; } spDbContext dbContext; public AccountController(IConfiguration configuration,spDbContext _dbContext) { Configuration = configuration; dbContext = _dbContext; } [HttpGet,HttpPost,Route("Login")] public userToken Login(loginDto loginUser) { //添加验证代码 Staff staff = dbContext.Staffs.Where(s => s.Account == loginUser.Name && s.Password == utility.MD5Utility.GetMD5(loginUser.Password)).FirstOrDefault(); if(staff != null) { return GetToken(staff); } else { return new userToken() { StatusCode = System.Net.HttpStatusCode.NotFound, Name = null, Token = null }; } } [Authorize] [HttpGet, HttpPost, Route("ChangePassword")] public bool ChangePassword(changePasswordDto dto) { Staff staff = dbContext.Staffs.Where(s => s.Id == dto.UserId && s.Password == utility.MD5Utility.GetMD5(dto.oldPassword)).FirstOrDefault(); if (staff != null) { staff.Password = utility.MD5Utility.GetMD5(dto.newPassword); dbContext.SaveChanges(); return true; } else { return false; } } [Authorize] [HttpGet,Route("GetUser")] public userToken GetUser() { if (User.Identity.IsAuthenticated)//如果Token有效 { var name = User.Claims.First(x => x.Type == ClaimTypes.Name).Value;//从Token中拿出用户ID //模拟获得Token spDbContext dbContext = new spDbContext(); Staff staff = dbContext.Staffs.Where(s => s.Account == name).FirstOrDefault(); if (staff != null) { return GetToken(staff); } else { return new userToken() {StatusCode=System.Net.HttpStatusCode.NotFound, Name = null, Token = null }; } } else { return new userToken() {StatusCode= System.Net.HttpStatusCode.NotFound, Name = null, Token = null }; } } private userToken GetToken(Staff staff) { var claims = new List() { new Claim("Id",staff.Id.ToString()), new Claim(ClaimTypes.Name,staff.Name), new Claim(ClaimTypes.Email,(staff.Mail==null)?"":staff.Mail), }; var positions = dbContext.DepartmentPositions.Where(dp => dp.StaffId == staff.Id).ToList(); foreach (var p in positions) { claims.Add(new Claim(ClaimTypes.Role, $"[{p.departmentId}]-[{p.PositionId}]")); } var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["jwt:Key"])); var credential = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var expireTime = DateTime.Now.AddHours(5); var token = new JwtSecurityToken( issuer: Configuration["jwt:Issuer"], audience: Configuration["jwt:Audience"], claims: claims.ToArray(), notBefore: DateTime.Now, expires: expireTime, signingCredentials: credential); string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); //建立UserToken物件後回傳client userToken userToken = new userToken() { StatusCode = System.Net.HttpStatusCode.OK, UserId = staff.Id, Name = staff.Name, Token = jwtToken, ExpireTime = expireTime }; return userToken; } [Authorize] [HttpGet, HttpPost, Route("GetRoles")] public List GetRoles(string ResourceId) { var Authors = Configuration[$"Authorize:{ResourceId}"]; if (string.IsNullOrEmpty(Authors)) { return new List(); } var ret = Authors.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); return ret.ToList(); } } }