我正在试图找出控制对我的应用程序不同部分的访问的正确方法。
我的应用有3个部分。
我已阅读http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx,所以我理解即使每个区域都有一个区域,我也不想将其用于我的授权。
我的想法是拥有3个基本控制器类,每个部分一个。像AdminBaseController
,SuperUserBaseController
和RegularUserBaseController
之类的东西。
我知道我可以在每个中添加AuthorizeAttribute
,但我想在我的设置中存储所需的角色,因此我无法在属性中设置这些角色。
所以我认为我需要继承AuthorizeAttribute
并覆盖OnAuthorization
,这就是我被困住的地方。这是我到目前为止所做的。
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.ControllerContext.Controller is AdminBaseController)
{
//do something
}
else if (actionContext.ControllerContext.Controller is SuperUserBaseController)
{
//do something
}
else if (actionContext.ControllerContext.Controller is RegularUserBaseController)
{
//do something
}
else
{
//someone forgot to use a base controller
//deny be default
}
}
我想我只是将Roles
和Users
属性设置为正确的值,然后在结尾处调用base.OnAuthorization
。这似乎是一个合理的解决方案吗?另外,要拒绝所有,我应该将这两个属性都设置为""
吗?
如果我离开了,请指出我的方向。
答案 0 :(得分:3)
查看Fluent Security http://www.fluentsecurity.net/
我比.NET中的内置安全功能更喜欢它。他们在样本中有基于角色的权限示例。它比你想做的更干净。
以下是有关如何使用Fluent Security为您的网站配置安全性的示例
/// <summary>
/// Configuration Helper for Fluent Security. See http://www.fluentsecurity.net
/// </summary>
public static class SecurityConfig
{
public static void Configure()
{
SecurityConfigurator.Configure(c =>
{
c.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated);
c.GetRolesFrom(() => (HttpContext.Current.Session["Roles"] as string[]));
// Blanket Deny All
c.ForAllControllers().DenyAnonymousAccess();
// Publicly Available Controllers
c.For<HomeController>().Ignore();
c.For<RegistrationsController>().Ignore();
c.For<LoginController>().Ignore();
// Only allow Admin To Create
c.For<ReservationsController>(x => x.Create())
.RequireRole(UserRoles.Admin.ToString());
c.For<ReservationsController>(x => x.Edit(""))
.RequireRole(UserRoles.Admin.ToString(),UserRoles.User.ToString());
c.For<ReservationsController>(x => x.Delete(""))
.RequireRole(UserRoles.Admin.ToString(),UserRoles.User.ToString());
});
}
}