using System; using System.Linq; using System.Web.Mvc; namespace WX.CRM.WebHelper { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class AuthorizeToolBarMore : AuthorizeAttribute { public class AuthorizeType { public AuthorizeType(string rightId, int toolBarId) { this._rightId = rightId; this._toolBarId = toolBarId; } public string _rightId { get; set; } public int _toolBarId { get; set; } } private const string IS_AUTHORIZED = "isAuthorized"; public string RedirectUrl = "~/Base/Account/UnAuthorized"; //private string _rightId; //private int _toolBarId; private AuthorizeType[] _param; private string[] m_roles; public AuthorizeToolBarMore() { this.m_roles = UserRightsHelper.getUserRights(); } public AuthorizeToolBarMore(string[] _rightIds, int[] _toolBarIds) { //_param = param; _param = new AuthorizeType[_rightIds.Length]; for (int i = 0; i < _rightIds.Length; i++) { _param[i] = new AuthorizeType(_rightIds[i], _toolBarIds[i]); } } protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { this.m_roles = UserRightsHelper.getUserRights(); bool isAuthorized = this.isAuthorizeCore(httpContext); httpContext.Items.Add(IS_AUTHORIZED, isAuthorized); return isAuthorized; } private bool isAuthorizeCore(System.Web.HttpContextBase httpContext) { bool IsAuthenticated = httpContext.User.Identity.IsAuthenticated; if (!IsAuthenticated) { return false; } int okCount = 0; foreach (var item in _param) { if (!string.IsNullOrEmpty(item._rightId) && item._toolBarId > 0 && !this.IsRoleToolBar(item._rightId, item._toolBarId)) { } else { okCount++; } } return okCount > 0; } private bool IsRoleToolBar(string role, int toobar) { int outInt = 0; if ((role != null) && (this.m_roles != null)) { string[] rolesRights = this.m_roles.Where(p => p.Contains(role)).ToArray(); for (int i = 0; i < rolesRights.Length; i++) { if ((rolesRights[i] != null) && (rolesRights[i].Length > 4) && (string.Compare(rolesRights[i], 0, role, 0, 4, StringComparison.OrdinalIgnoreCase) == 0) && int.TryParse(rolesRights[i].Substring(4), out outInt) && (outInt & toobar) > 0) { return true; } } } return false; } public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null ? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED]) : false; if (!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated) { filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl + "?type=button"); } } } }