asp.net MVC 3将AuthorizeAttribute应用于区域

| 我目前正在编写一个Admin MVC 3网站,每个用户只能访问该网站的某些部分。 我网站的区域与用户角色相同,因此我想做的是将AuthorizeAttribute放在每个区域上,并使用区域名称作为Role中的参数。 到目前为止,当我对每个区域的检查进行硬编码时,我已经可以使用它了,但是我只想遍历所有区域并应用Authorize过滤器。 (我将其用作我的自定义FilterProvider-http://www.dotnetcurry.com/ShowArticle.aspx?ID=578) 到目前为止,我的代码(\“ Gcm \”是我的领域之一,也是一个角色):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    // for all controllers, run AdminAuthorizeAttribute to make sure they\'re at least logged in
    filters.Add(ObjectFactory.GetInstance<AdminAuthorizeAttribute>());

    AdminAuthorizeAttribute gcmAuthroizeAttribute = ObjectFactory.GetInstance<AdminAuthorizeAttribute>();
    gcmAuthroizeAttribute.Roles = \"Gcm\";

    var provider = new FilterProvider();
    provider.Add(
        x =>
        x.RouteData.DataTokens[\"area\"] != null && x.RouteData.DataTokens[\"area\"].ToString() == \"Gcm\"
            ? gcmAuthroizeAttribute
            : null);
    FilterProviders.Providers.Add(provider);
}
有谁知道如何获得应用程序的所有区域,因此我可以遍历它们,而不是对每个区域进行硬编码? 或者,如果有人对如何对每个区域进行授权有更好的主意,将不胜感激。 谢谢你的帮助 萨恩     
已邀请:
您可以为每个区域创建一个基本控制器,然后将authorize属性放在基类上。这样,您可以为每个区域的基本控制器传递area参数。     
这是我创建的“授权属性”替代的示例。我需要我的authorize函数来支持各种成员类型,因此您可能不想过多地关注函数的内部工作原理,但是AuthorizeCore是主要逻辑所在。就我而言,我正在对照实体datacontext检查它。 用法:
[AjaxAuthorize(AjaxRole = \"Administrators\")]
public JsonResult SaveAdministrativeUser(v.... )
码:
 public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        private class HttpAuthorizeFailedResult : ActionResult
        {
            public override void ExecuteResult(ControllerContext context)
            {                
                // Set the response code to 403.   Membership.Provider.Name == \"UnitArchiveMembershipProvider\"
                context.HttpContext.Response.StatusCode = context.HttpContext. User.Identity is WindowsIdentity ?  401 : 403; 
            }
        }

        public string AjaxRole { get; set;}

        public AjaxAuthorizeAttribute()
        {
            AjaxRole = \"Users\";
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (string.IsNullOrEmpty(MvcApplication.Config.DBSettings.Database))
            {
                return true;
            }

            //When authorize parameter is set to false, not authorization should be performed.
            UnitArchiveData db = DataContextFactory.GetWebRequestScopedDataContext<UnitArchiveData>(MvcApplication.Config.DBSettings.GetConnectionString());            


            if (httpContext.User.Identity.IsAuthenticated)
            {
                login_data user = db.login_datas.Where(n => n.EmailAddress == httpContext.User.Identity.Name).FirstOrDefault();
                if (user != null)
                {
                    return user.cd_login_role.RoleName == \"Administrators\" || user.cd_login_role.RoleName == AjaxRole;
                }
            }

            return false;

        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
            {
                //Ajax request doesn\'t return to login page, it just returns 403 error.
                filterContext.Result = new HttpAuthorizeFailedResult();
            }
            else
                base.HandleUnauthorizedRequest(filterContext);
        }
    }
    
当我调查一个单独的问题时,遇到了如何将参数传递给ASP.NET MVC 2中的自定义ActionFilter? 可以更改该属性示例以检查当前控制器的区域。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        RouteData routeData = filterContext.RouteData;

        // check if user is allowed on this page
        if (SessionFactory.GetSession().Contains(SessionKey.User))
        {
            User user = (User)SessionFactory.GetSession().Get(SessionKey.User);
            string thisArea = routeData.DataTokens[\"area\"].ToString();

            // if the user doesn\'t have access to this area
            if (!user.IsInRole(thisArea))
            {
                HandleUnauthorizedRequest(filterContext);
            }
        }

        // do normal OnAuthorization checks too
        base.OnAuthorization(filterContext);
    }
}
然后,将我的自定义授权属性应用于Global.asax中的所有控制器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    // for all controllers, run CustomAuthorizeAttribute to make sure they\'re at logged in and have access to area
    filters.Add(ObjectFactory.GetInstance<CustomAuthorizeAttribute>());
}
感谢所有回答 萨恩     

要回复问题请先登录注册