206 lines
8.7 KiB
C#
206 lines
8.7 KiB
C#
|
|
using Microsoft.AspNetCore.Http.Extensions;
|
|||
|
|
using Microsoft.AspNetCore.Mvc;
|
|||
|
|
using Microsoft.AspNetCore.Mvc.Filters;
|
|||
|
|
using Microsoft.IdentityModel.Tokens;
|
|||
|
|
using Models;
|
|||
|
|
using System.IdentityModel.Tokens.Jwt;
|
|||
|
|
using System.Text;
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using System.Security.Claims;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System;
|
|||
|
|
using SERVER;
|
|||
|
|
using Microsoft.AspNetCore.Http;
|
|||
|
|
using Quartz;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using WebUI.LIB;
|
|||
|
|
using COMMON;
|
|||
|
|
using SERVER.LIB;
|
|||
|
|
|
|||
|
|
namespace WebUI.Controllers
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 基础控制器 判定权限
|
|||
|
|
/// </summary>
|
|||
|
|
public class BaseController : Controller
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 用户 权限酒店原始数据 有分组
|
|||
|
|
/// </summary>
|
|||
|
|
public IList<HotelDataItem> Hotels = new List<HotelDataItem>();
|
|||
|
|
/// <summary>
|
|||
|
|
/// 用户 当前选择的酒店 这里的id 等于库里面 的 oLDid
|
|||
|
|
/// </summary>
|
|||
|
|
public HotelsItem SelHotel = new HotelsItem { };
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 用户 权限酒店
|
|||
|
|
/// </summary>
|
|||
|
|
public List<HotelsItem> Hoteldata = new List<HotelsItem>();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public Datainfo data { get; set; } = null;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// TOken 是用户名
|
|||
|
|
/// </summary>
|
|||
|
|
public string TOken { get; set; } = string.Empty;
|
|||
|
|
public string TOken_rom { get; set; } = string.Empty;
|
|||
|
|
public string Cookie { get; set; } = string.Empty;
|
|||
|
|
//复写父类的该方法。执行控制器中的方法之前先执行该方法。从而实现过滤的功能。
|
|||
|
|
public override void OnActionExecuting(ActionExecutingContext filterContext)
|
|||
|
|
{
|
|||
|
|
base.OnActionExecuting(filterContext); //调用父类的该方法。
|
|||
|
|
Cookie = Request.Cookies["CurrentUser"];
|
|||
|
|
if (Cookie != null)
|
|||
|
|
{
|
|||
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.Instance.SecurityKey));
|
|||
|
|
//校验token
|
|||
|
|
var validateParameter = new TokenValidationParameters()
|
|||
|
|
{
|
|||
|
|
ValidateLifetime = true,
|
|||
|
|
ValidateAudience = true,
|
|||
|
|
ValidateIssuer = true,
|
|||
|
|
ValidateIssuerSigningKey = true,
|
|||
|
|
ValidIssuer = JwtConst.Instance.Domain,
|
|||
|
|
ValidAudience = JwtConst.Instance.Domain,
|
|||
|
|
IssuerSigningKey = key
|
|||
|
|
};
|
|||
|
|
//不校验,直接解析token
|
|||
|
|
//jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token1);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//校验并解析token
|
|||
|
|
var claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(Request.Cookies["CurrentUser"], validateParameter, out SecurityToken validatedToken);//validatedToken:解密后的对象
|
|||
|
|
//var jwtPayload = ((JwtSecurityToken)validatedToken).Payload.SerializeToJson(); //获取payload中的数据
|
|||
|
|
TOken = claimsPrincipal.Identities.First().Name;
|
|||
|
|
int[] rom = XC_Redis.Redis.GetKey<int[]>(TOken + Cookie.Substring(Cookie.Length - 8) + "_rom");
|
|||
|
|
TOken_rom = TOken;
|
|||
|
|
if (rom == null)
|
|||
|
|
{
|
|||
|
|
rom = XC_Redis.Redis.GetKey<int[]>(TOken + Cookie.Substring(Cookie.Length - 8) + "_rom_old");
|
|||
|
|
};
|
|||
|
|
if (rom == null)
|
|||
|
|
{
|
|||
|
|
throw new Exception();
|
|||
|
|
};
|
|||
|
|
foreach (var item in rom)
|
|||
|
|
{
|
|||
|
|
TOken_rom += Cookie[item];
|
|||
|
|
}
|
|||
|
|
data = XC_Redis.Redis.GetKey<Datainfo>(TOken);
|
|||
|
|
if (data == null)
|
|||
|
|
{
|
|||
|
|
throw new Exception();
|
|||
|
|
}
|
|||
|
|
SelHotel = XC_Redis.Redis.GET(TOken_rom + "_sel", () =>
|
|||
|
|
{
|
|||
|
|
if (data.HotelData == null || data.HotelData.Count <= 0)
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
// 账号其他地方 登录 更新权限信息
|
|||
|
|
// 同一账号 权限信息 共享 不会因为先登录而多用有某些权限
|
|||
|
|
XC_Redis.Redis.Remove(TOken + "_Hoteldata");
|
|||
|
|
return data.HotelData.FirstOrDefault().Hotels.FirstOrDefault();
|
|||
|
|
});
|
|||
|
|
Hotels = data.HotelData;
|
|||
|
|
|
|||
|
|
Hoteldata = XC_Redis.Redis.GET(TOken + "_Hoteldata", () =>
|
|||
|
|
{
|
|||
|
|
foreach (var item in Hotels)
|
|||
|
|
{
|
|||
|
|
Hoteldata.AddRange(item.Hotels);
|
|||
|
|
}
|
|||
|
|
return Hoteldata;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
ViewBag.SelHotel = SelHotel;
|
|||
|
|
|
|||
|
|
ViewBag.Uname = TOken;
|
|||
|
|
|
|||
|
|
ViewBag.HeadImg = data.Userinfo.HeadImg;
|
|||
|
|
|
|||
|
|
string keys = data.Userinfo.Uid;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (SecurityTokenExpiredException ex)
|
|||
|
|
{
|
|||
|
|
LogHelp.Error(ex.ToString());
|
|||
|
|
//表示过期
|
|||
|
|
filterContext.Result = Redirect("/Login/index?REURL=" + HttpContext.Request.GetDisplayUrl());
|
|||
|
|
}
|
|||
|
|
catch (SecurityTokenException ex)
|
|||
|
|
{
|
|||
|
|
LogHelp.Error(ex.ToString());
|
|||
|
|
//表示token错误
|
|||
|
|
filterContext.Result = Redirect("/Login/index?REURL=" + HttpContext.Request.GetDisplayUrl());
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
LogHelp.Error(ex.ToString());
|
|||
|
|
filterContext.Result = Redirect("/Login/index?REURL=" + HttpContext.Request.GetDisplayUrl());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//这种跳转方式直接返回一个ActionResult,不会继续向下执行,而是直接跳转。速度快。
|
|||
|
|
filterContext.Result = Redirect("/Login/index?REURL=" + HttpContext.Request.GetDisplayUrl());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void SXTOKEN(BaseController baseController, HttpContext httpContext)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
var keys = baseController.TOken;
|
|||
|
|
|
|||
|
|
var claims = new[]
|
|||
|
|
{
|
|||
|
|
new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
|
|||
|
|
new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(20)).ToUnixTimeSeconds()}"),
|
|||
|
|
new Claim(ClaimTypes.Name,keys)
|
|||
|
|
};
|
|||
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.Instance.SecurityKey));
|
|||
|
|
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|||
|
|
var token = new JwtSecurityToken(
|
|||
|
|
issuer: JwtConst.Instance.Domain,
|
|||
|
|
audience: JwtConst.Instance.Domain,
|
|||
|
|
claims: claims,
|
|||
|
|
expires: DateTime.Now.AddMinutes(20),
|
|||
|
|
signingCredentials: creds);
|
|||
|
|
var RES = new ReturnData<string> { IsSuccess = true };
|
|||
|
|
string toke = new JwtSecurityTokenHandler().WriteToken(token);
|
|||
|
|
|
|||
|
|
httpContext.Response.Cookies.Append("CurrentUser", toke);
|
|||
|
|
|
|||
|
|
int[] rom = {
|
|||
|
|
new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
|
|||
|
|
new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
|
|||
|
|
new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
|
|||
|
|
new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
XC_Redis.Redis.SetKey(keys + baseController.Cookie.Substring(baseController.Cookie.Length - 8) + "_rom_old",
|
|||
|
|
|
|||
|
|
XC_Redis.Redis.GetKey<int[]>(keys + baseController.Cookie.Substring(baseController.Cookie.Length - 8) + "_rom"), 10);
|
|||
|
|
|
|||
|
|
XC_Redis.Redis.Remove(keys + baseController.Cookie.Substring(baseController.Cookie.Length - 8) + "_rom");
|
|||
|
|
|
|||
|
|
XC_Redis.Redis.SetKey(keys + toke.Substring(toke.Length - 8) + "_rom", rom, 20);
|
|||
|
|
|
|||
|
|
foreach (var item in rom)
|
|||
|
|
{
|
|||
|
|
keys += toke[item];
|
|||
|
|
}
|
|||
|
|
XC_Redis.Redis.SetKey(baseController.TOken, baseController.data, 20);
|
|||
|
|
XC_Redis.Redis.SetKey(keys + "_sel", baseController.SelHotel,20);
|
|||
|
|
XC_Redis.Redis.SetKey(baseController.TOken_rom + "_sel", baseController.SelHotel,10);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|