From 599aeb0d380f9b194e1dc363364779f3b498969e Mon Sep 17 00:00:00 2001
From: llj <132905093+newwwwwwtree@users.noreply.github.com>
Date: 星期四, 30 四月 2026 10:58:03 +0800
Subject: [PATCH] 1
---
WebAPI/Service/JwtAuthorizeAttribute.cs | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 155 insertions(+), 20 deletions(-)
diff --git a/WebAPI/Service/JwtAuthorizeAttribute.cs b/WebAPI/Service/JwtAuthorizeAttribute.cs
index d641d3b..9418f11 100644
--- a/WebAPI/Service/JwtAuthorizeAttribute.cs
+++ b/WebAPI/Service/JwtAuthorizeAttribute.cs
@@ -1,43 +1,138 @@
锘縰sing System;
+using System.Linq;
using System.Net;
using System.Net.Http;
+using System.Reflection;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
+using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
+using WebAPI.Models;
using WebAPI.Utility;
public class JwtAuthorizeAttribute : AuthorizationFilterAttribute
{
+ private json objjson = new json();
+ private SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+ private Pub_Class.ClsXt_SystemParameter oSystemParameter = new Pub_Class.ClsXt_SystemParameter();
+ private string campanyName = "";
+
+ public JwtAuthorizeAttribute()
+ {
+ if (oSystemParameter.ShowBill(ref DBUtility.ClsPub.sErrInfo))
+ {
+ campanyName = oSystemParameter.omodel.WMS_CampanyName;
+ }
+ }
+
+
// 鍚屾閴存潈
public override void OnAuthorization(HttpActionContext actionContext)
{
- // 妫�鏌ュ尶鍚嶈闂�
- if (IsAnonymousAllowed(actionContext)) return;
-
- // 鑾峰彇Token
- var token = GetTokenFromHeader(actionContext);
- if (string.IsNullOrEmpty(token))
+ try
{
- HandleUnauthorized(actionContext);
- return;
- }
+ // 妫�鏌ュ尶鍚嶈闂�(璁よ瘉)
+ if (IsAnonymousAllowed(actionContext)) return;
- // 楠岃瘉Token
- var principal = JWTHelper.ValidateToken(token, "123");
- if (principal == null)
+ // 鑾峰彇Token
+ var token = GetTokenFromHeader(actionContext);
+ if (string.IsNullOrEmpty(token))
+ {
+ HandleUnauthorized(actionContext);
+ return;
+ }
+
+ // 楠岃瘉Token
+ // 鍙互澧炲姞鏇寸粏绮掑害鐨勬帶鍒讹紝娣诲姞 鏍规嵁缁勭粐ID 鍒ゆ柇锛堥棶棰�: 鍏徃鍚嶄笉鑳戒娇鐢ㄤ腑鏂囷紝鍙兘闇�瑕佹坊鍔犺嫳鏂囧瓧娈碉級
+ var principal = JWTHelper.ValidateToken(token);
+ if (principal == null)
+ {
+ HandleUnauthorized(actionContext);
+ return;
+ }
+
+ // 妫�鏌� Token鍜屽綋鍓嶇櫥褰曠敤鎴锋槸鍚﹀尮閰�
+ var HUserName = GetUserNameFromHeader(actionContext) ?? "";
+ var TokenUserName = JWTHelper.getUserName(token);
+ if(!string.IsNullOrWhiteSpace(HUserName))
+ {
+ HUserName = HttpUtility.UrlDecode(HUserName);
+ }
+ if(TokenUserName != HUserName)
+ {
+ // 濡傛灉Token鍜屽綋鍓嶇櫥褰曠敤鎴蜂笉鍖归厤锛屽垯闇�瑕佸憡鐭ュ墠绔敤鎴� Token 杩囨湡锛岄渶閲嶆柊鐧诲綍
+ HandleUnauthorized(actionContext);
+ return;
+ }
+
+ // 璁剧疆鐢ㄦ埛
+ actionContext.RequestContext.Principal = principal;
+
+ // 楠岃瘉鏄惁鎷ユ湁璁块棶妯″潡鐨勬潈闄�
+ // 鏈変袱绉嶅垽鏂柟寮� 涓�绉嶆槸閫氳繃瑙掕壊鍘诲垽鏂紝涓�绉嶆槸閫氳繃鐢ㄦ埛鍘诲垽鏂� 鐩墠鏆傛椂涓嶅仛鍖哄垎锛屽悗缁彲澧炲姞绯荤粺鍙傛暟鏉ヨ繘琛屽尯鍒�
+ // 瀹夊叏鎺у埗鍣ㄦ弿鏍囩
+ var controllerAttr = actionContext.ControllerContext?.ControllerDescriptor?.GetCustomAttributes<PermissionAttribute>().FirstOrDefault();
+
+ // 瀹夊叏鑾峰彇Action鏍囩
+ var actionAttr = actionContext.ActionDescriptor?.GetCustomAttributes<PermissionAttribute>().FirstOrDefault();
+
+ string PermissionStr = string.Empty;
+ // 鍒ゆ柇鎺у埗鍣ㄧ骇鍒笂鏄惁鍚敤浜嗛壌鏉冩爣绛�
+ if(controllerAttr != null && !string.IsNullOrWhiteSpace(controllerAttr?.HModName))
+ {
+ PermissionStr += controllerAttr.HModName;
+
+ // 鏌ョ湅鏄惁闇�瑕佹洿缁嗙矑搴︾殑鎺у埗
+ if(actionAttr != null && !string.IsNullOrWhiteSpace(actionAttr?.Operate))
+ {
+ // 璇ュ姩浣滃搴旂殑妯″潡鍚嶅拰鎺у埗鍣ㄥ悕鏄惁涓嶄竴鑷�
+ if (string.IsNullOrWhiteSpace(actionAttr.HModName))
+ {
+ PermissionStr = actionAttr.HModName + actionAttr.Operate;
+ }
+ else
+ {
+ PermissionStr += actionAttr.Operate;
+ }
+
+ }
+
+ if(!string.IsNullOrWhiteSpace(PermissionStr))
+ {
+ if (!DBUtility.ClsPub.Security_Log(PermissionStr, 1, false, JWTHelper.getUserName(token)))
+ {
+ HandleForbidden(actionContext);
+ return;
+ }
+ }
+
+ }else if (actionAttr != null && !string.IsNullOrWhiteSpace(actionAttr?.HModName) && !string.IsNullOrWhiteSpace(actionAttr?.Operate))
+ {
+ // 鍗曠嫭鍦ㄥ姩浣滀笂鍚敤閴存潈鍔熻兘
+ PermissionStr = actionAttr.HModName + actionAttr.Operate;
+
+ if (!string.IsNullOrWhiteSpace(PermissionStr))
+ {
+ if (!DBUtility.ClsPub.Security_Log(PermissionStr, 1, false, JWTHelper.getUserName(token)))
+ {
+ HandleForbidden(actionContext);
+ return;
+ }
+ }
+ }
+
+
+ }
+ catch (Exception e)
{
- HandleUnauthorized(actionContext);
- return;
+ HandleError(actionContext, e.Message);
}
-
- // 璁剧疆鐢ㄦ埛
- actionContext.RequestContext.Principal = principal;
}
- // 寮傛閴存潈锛堟弧瓒砏ebAPI 2瑕佹眰锛屽吋瀹�.NET4.5锛�
+ // 寮傛閴存潈
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
OnAuthorization(actionContext);
@@ -45,7 +140,7 @@
return Task.FromResult(0);
}
- // 鏄惁鍏佽鍖垮悕璁块棶
+ // 鏄惁鍏佽鍖垮悕璁块棶(鎺у埗鍣ㄧ骇鍒拰鍔ㄤ綔绾у埆閮藉彲鐢�)
private bool IsAnonymousAllowed(HttpActionContext context)
{
return
@@ -66,11 +161,51 @@
return null;
}
+ // 浠嶩eader涓幏鍙栫敤鎴峰悕
+ private string GetUserNameFromHeader(HttpActionContext context)
+ {
+ var headers = context.Request.Headers;
+ string userName = "";
+ if (headers.Contains("X-Username"))
+ {
+ userName = headers.GetValues("X-Username").FirstOrDefault();
+ }
+
+ return userName;
+ }
+
// 401 鏈巿鏉�
private void HandleUnauthorized(HttpActionContext context)
{
var response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
- response.Content = new StringContent("鏈巿鏉冿紝璇风櫥褰曞悗閲嶈瘯");
+ objjson.code = "0";
+ objjson.count = 0;
+ objjson.Message = "鏈巿鏉冿紝璇风櫥褰曞悗閲嶈瘯";
+ response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(objjson),
+ System.Text.Encoding.UTF8, "application/json");
+ context.Response = response;
+ }
+
+ // 403 鏃犳潈闄�
+ private void HandleForbidden(HttpActionContext context)
+ {
+ var response = new HttpResponseMessage(HttpStatusCode.Forbidden);
+ objjson.code = "0";
+ objjson.count = 0;
+ objjson.Message = "鎮ㄦ病鏈夎妯″潡鏉冮檺,璇蜂笌绠$悊鍛樿仈绯伙紒";
+ response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(objjson),
+ System.Text.Encoding.UTF8, "application/json");
+ context.Response = response;
+ }
+
+ private void HandleError(HttpActionContext context, string ErrorInfo)
+ {
+ var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
+ objjson.code = "0";
+ objjson.count = 0;
+ objjson.Message = "鏈嶅姟鍣ㄥ紓甯�: " + ErrorInfo;
+ response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(objjson),
+ System.Text.Encoding.UTF8, "application/json");
context.Response = response;
}
}
\ No newline at end of file
--
Gitblit v1.9.1