MVC3 контроль доступа - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь отключить / включить элементы управления на основе разрешения пользователя, используя пользовательские рамки безопасности. Я пытаюсь использовать этот код в файле codebehind

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 недоступно. Есть ли способ, как я могу это исправить или лучший способ добиться этого?

--- Update ---

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 Ответ

4 голосов
/ 26 марта 2012

Вы не должны использовать codebehind с 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()
    {
        // ...
    }
}
...