首页 新闻 会员 周边 捐助

AuthorizeCore 没有找到合适的方法来重新

0
悬赏园豆:5 [已解决问题] 解决于 2012-10-10 12:34

定义了一个类继承自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这个方法的啊。

Gamain的主页 Gamain | 菜鸟二级 | 园豆:357
提问于:2012-10-10 11:21
< >
分享
最佳答案
0

试试加引用System.Web.Abstractions

收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-10-10 11:24

  非常感谢,真的可以了,这是什么原理呢?

Gamain | 园豆:357 (菜鸟二级) | 2012-10-10 12:34

@Gamain: 好像是因为3.5和4.0两个版本的AuthorizeAttribute在2个不同的dll中,应该算是个bug。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-10 13:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册