MVC条件授权

时间:2013-01-30 18:29:47

标签: c# asp.net-mvc asp.net-mvc-4 authorization

我正在试图找出控制对我的应用程序不同部分的访问的正确方法。

我的应用有3个部分。

  1. 管理员
  2. 超级用户
  3. 普通用户
  4. 我已阅读http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx,所以我理解即使每个区域都有一个区域,我也不想将其用于我的授权。

    我的想法是拥有3个基本控制器类,每个部分一个。像AdminBaseControllerSuperUserBaseControllerRegularUserBaseController之类的东西。

    我知道我可以在每个中添加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
            }
        }
    

    我想我只是将RolesUsers属性设置为正确的值,然后在结尾处调用base.OnAuthorization。这似乎是一个合理的解决方案吗?另外,要拒绝所有,我应该将这两个属性都设置为""吗?

    如果我离开了,请指出我的方向。

1 个答案:

答案 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());           
        });
    }
}