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)
感谢所有回复的人
萨恩