MVC3访问控制

时间:2012-03-26 14:59:56

标签: asp.net-mvc-3 security controls

我正在尝试使用自定义安全框架根据用户权限禁用/启用控件。我正在尝试在代码隐藏文件中使用此代码

protected void OnLoadComplete(object sender, EventArgs e)
        {
            if ((ViewData[Constants.Permission]).Equals(Security.UserAccess.ReadOnlyAccess))
            {
                foreach (var control in this.Page.Controls  )
                {
                    control.IsReadOnly = true;
                }
            }
        }

但是控件的IsReadOnly属性不可用。有没有办法解决这个或更好的方法来实现这个目标?

--- ---更新

Controller.cs

    [Proxy.AimsAccessLevel]
    public ActionResult Edit(int clientId)
    {
        ClientId = clientId;
        //SetClientDetails();

        var Selection = new SelectionArgs(clientId, null);

        if (Selection.SelectionFlag == null || Selection.SelectionFlag == "N")
            Selection.EffectiveDate = new DateTime(DateTime.Now.Year + 1, 1, 1);

        return View(Selection); 
    }

proxy.cs

public class AccessLevel : AuthorizeAttribute
        {
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                Roles = Constants.AccessLevel.FullEdit + Constants.AccessLevel.ReadOnly.ToString() +
                        Constants.AccessLevel.RestrictedEdit;
                return base.AuthorizeCore(httpContext);
            }
        }

1 个答案:

答案 0 :(得分:4)

你不应该在ASP.Net MVC中使用代码隐藏 - 它违背了MVC的原则。视图不应该决定用户是否具有权限。确定页面是否可见是属于控制器级别的。

处理权限的更好方法是使用控制器上的[Authorize]属性。即,

public MyController : Controller
{
    [Authorize(Roles = "admin")]  // Uses default FormsAuthentication
    public ActionResult Index()
    {
        // ...
    }
}

您可以编写自己的Authorize属性以与自定义框架绑定:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext filterContext )
    {
        // ... authorization stuff here ...
    }
}

然后在控制器操作中使用它:

public HomeController : Controller
{
    [MyAuthorize]
    public ActionResult Index()
    {
        // ...
    }
}