我正在尝试使用自定义安全框架根据用户权限禁用/启用控件。我正在尝试在代码隐藏文件中使用此代码
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);
}
}
答案 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()
{
// ...
}
}