Files
17168ERP/web/App_Code/api/ezAuthorizeAttribute.cs
2025-08-29 01:27:25 +08:00

179 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Claims;
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
/// <summary>
/// Summary description for ezAuthorizeAttribute
/// </summary>
public class ezAuthorizeAttribute : AuthorizeAttribute
{
////Entities context = new Entities(); // my entity
private static readonly string[] _emptyArray = new string[0];
private readonly object _typeId = new object();
private string _roles;
private string[] _rolesSplit = _emptyArray;
private string _users;
private string[] _usersSplit = _emptyArray;
new public string Roles
{
get { return _roles ?? String.Empty; }
set
{
_roles = value;
_rolesSplit = SplitString(value);
}
}
new public string Users
{
get { return _users ?? String.Empty; }
set
{
_users = value;
_usersSplit = SplitString(value);
}
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
MyWeb.admin admin = new MyWeb.admin();
bool isLogin = admin.isLoign();
//if (admin.chkAdmIP && (admin.chkTwIP || admin.chkAdmIP_Enable)) { }
//判斷是否登入
if (!isLogin) {
return false;
}
/*
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
IPrincipal user = HttpContext.Current.User;
if (user == null || !user.Identity.IsAuthenticated)
{
return false;
}
*/
return true;
}
protected bool IsAllowed(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
IPrincipal user = Thread.CurrentPrincipal;
if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
{
return false;
}
if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
{
return false;
}
return true;
}
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
if (SkipAuthorization(actionContext))
{
return;
}
if (!IsAuthorized(actionContext))
{
HandleUnauthorizedRequest(actionContext);
}
if (!IsAllowed(actionContext))
{
HandleForbiddenRequest(actionContext);
}
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
HttpResponseMessage result = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.Unauthorized,
RequestMessage = actionContext.Request
};
actionContext.Response = result;
}
protected void HandleForbiddenRequest(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
HttpResponseMessage result = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.Forbidden,
RequestMessage = actionContext.Request
};
actionContext.Response = result;
}
private static bool SkipAuthorization(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()
|| actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();
}
internal static string[] SplitString(string original)
{
if (String.IsNullOrEmpty(original))
{
return _emptyArray;
}
var split = from piece in original.Split(',')
let trimmed = piece.Trim()
where !String.IsNullOrEmpty(trimmed)
select trimmed;
return split.ToArray();
}
}
/*
[ezAuthorize(Roles = "admin")]//群組:*
[ezAuthorize(Users = "admin")]//群組:*
[ezAuthorize] //檢查有登入
*/