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

Saa*_*aan 6 asp.net-mvc filter asp.net-mvc-areas authorize-attribute asp.net-mvc-3

我目前正在编写一个Admin MVC 3站点,每个用户只能访问该站点的某些部分.

我的站点区域与用户角色相同,所以我想要做的是在每个区域放置AuthorizeAttribute,使用区域名称作为角色中的参数.

到目前为止,当我对每个区域的检查进行硬编码时,我已经开始工作了,但是我想循环遍历所有区域并应用授权过滤器.(我使用它作为我的自定义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);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何获得我的应用程序的所有区域,所以我可以循环它们,而不是硬编码每个区域?

或者,如果有人对如何授权每个区域有更好的了解,那将是值得赞赏的.

谢谢你的帮助Saan

Saa*_*aan -1

当我调查一个单独的问题时,我遇到了如何将参数传递给 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我将自定义授权属性应用到 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>());
}
Run Code Online (Sandbox Code Playgroud)

感谢所有回复的人

萨恩