定义了一个类继承自AuthorizeAttribute的类UserAuthorize
public class UserAuthorize : AuthorizeAttribute { /// <summary> /// 有权限的用户 /// </summary> public string AllowUser { get; set; } /// <summary> /// 有权限的用户列表 /// </summary> public List<QSMC.FrameWork.Authorith.User.WebRoleType> AllowUsers { get; set; } /// <summary> /// 授权失败时呈现的视图名称 /// </summary> public string View { get; set; } /// <summary> /// 请求权限时执行 /// </summary> /// <param name="filterContext"></param> public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); //可用如下方法获得请求授权页面的controller和action //var controller = filterContext.RouteData.Values["controller"].ToString(); //var action = filterContext.RouteData.Values["action"].ToString(); } /// <summary> /// 自定义授权检查 /// </summary> /// <param name="httpContext"></param> /// <returns></returns> protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext == null) { throw new ArgumentNullException("httpContext"); } //return base.AuthorizeCore(httpContext); var CurrentUser = (User)httpContext.Session["CurrentUser"];//获取当前登录用户 var CurrentRole = CurrentUser.RoleType.ToString();//获取当前登录用户的角色 foreach (string authRole in AllowUser.Split(',')) { if (authRole == CurrentRole) return true; } var query = AllowUsers.Select(x => x == CurrentUser.RoleType); if (query.Count() > 0) return true; return false;//判断权限失败,进入HandleUnauthorizedReques方法 } /// <summary> /// 如果权限判断成功,则执行此操作 /// </summary> /// <param name="filterContext"></param> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { System.Web.HttpContext.Current.Session["UserData"] = null;//清空Session // Session["UserData"] = null; base.HandleUnauthorizedRequest(filterContext); // filterContext.Result = new ViewResult { ViewName = View }; filterContext.Result = new RedirectResult("/Login/Index"); } #region 这个也可以判断权限,,根据权限令牌 //protected override bool AuthorizeCore(HttpContextBase httpContext) //{ // bool result = false; // if (httpContext == null) // { // throw new ArgumentNullException("httpContext"); // } // string[] users = Users.Split(','); // string[] roles = Roles.Split(','); // if (!httpContext.User.Identity.IsAuthenticated) // return false; // if (roles.Length != 0) // { // List<Role> rightRoles = RightClient.GetAllRole(TakenAclMenu.SystemID, TakenAclMenu.UserID); // foreach (var role in roles) // { // if (rightRoles.Where(x => x.Code == role).Count() > 0) // { // result = true; // break; // } // } // } // if (!result) // { // httpContext.Response.StatusCode = 403; // } // return result; //} //public override void OnAuthorization(AuthorizationContext filterContext) //{ // base.OnAuthorization(filterContext); // if (filterContext.HttpContext.Response.StatusCode == 403) // { // filterContext.Result = new RedirectResult("/Admin/Dashboard"); // } //} #endregion }
AuthorizeAttribute类的定义如下
using System; using System.Web; namespace System.Web.Mvc { // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter { // 摘要: // 初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。 public AuthorizeAttribute(); // 摘要: // 获取或设置用户角色。 // // 返回结果: // 用户角色。 public string Roles { get; set; } public override object TypeId { get; } // // 摘要: // 获取或设置授权用户。 // // 返回结果: // 授权用户。 public string Users { get; set; } // 摘要: // 确定是否获得访问核心框架的授权。 // // 参数: // httpContext: // HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。 // // 返回结果: // 如果获得访问授权,则为 true;否则为 false。 // // 异常: // System.ArgumentNullException: // httpContext 参数为 null。 protected virtual bool AuthorizeCore(HttpContextBase httpContext); // // 摘要: // 处理授权失败的 HTTP 请求。 // // 参数: // filterContext: // 封装用于 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。 protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext); // // 摘要: // 在过程请求授权时调用。 // // 参数: // filterContext: // 筛选器上下文,它封装用于 System.Web.Mvc.AuthorizeAttribute 的信息。 // // 异常: // System.ArgumentNullException: // filterContext 参数为 null。 public virtual void OnAuthorization(AuthorizationContext filterContext); // // 摘要: // 在缓存模块请求授权时调用。 // // 参数: // httpContext: // HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。 // // 返回结果: // 对验证状态的引用。 // // 异常: // System.ArgumentNullException: // httpContext 参数为 null。 protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext); } }
理论上AuthorizeCore 这个方法是可以重写的,但是为什么我一编译就会报错呢:
错误 1 “QSMC.FrameWork.Authorith.UserAuthorize.AuthorizeCore(System.Web.HttpContextBase)”: 没有找到适合的方法来重写 E:\Workspace\QSMC.EITruck\QSMC.FrameWork\Authorith\UserAuthorize.cs 46 33 QSMC.FrameWork
说是没有找到合适的方法来重写AuthorizeCore,但是基类里面明明是有AuthorizeCore这个方法的啊。
试试加引用System.Web.Abstractions
非常感谢,真的可以了,这是什么原理呢?
@Gamain: 好像是因为3.5和4.0两个版本的AuthorizeAttribute在2个不同的dll中,应该算是个bug。