0

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

我的应用程序有 3 个部分。

  1. 管理员
  2. 超级用户
  3. 普通用户

我读过http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx,所以我明白即使我有每个区域都有一个区域,我不想将其用于我的授权。

我的想法是有 3 个基本控制器类,每个部分一个。像AdminBaseController,SuperUserBaseControllerRegularUserBaseController.

我知道我可以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
        }
    }

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

如果我走得很远,请为我指出一个更好的方向。

4

1 回答 1

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());           
        });
    }
}
于 2013-01-30T18:43:33.657 回答