asp mvc细粒度查看权限

时间:2012-09-11 13:51:28

标签: asp.net-mvc security authorization

我正在构建ASP MVC 4 Web应用程序,我需要为我的视图创建细粒度的权限。 这意味着我需要向某些用户显示一些操作,具体取决于他们的角色,数据类型请求和其他授权规则。

在控制器端,我在适当的位置放置了Authorize属性,并创建了细粒度的代码,如下所示:

public ActionResult Index() {
  List<Survey> surveys;
  if (MyUser.IsSuperUser) {
    surveys = surveyRep.AllSurveys.ToList();
  }
  else {
    surveys = surveyRep.VisibleSurveys.ToList();
  }

  return View(surveys);
}

因为我正在构建多租户应用程序,所以非超级用户的用户只能看到“可见”调查。超级用户总能看到一切。

现在的问题是如何在视图方面创建相同的东西,而不重复逻辑(DRY)。

目前,当用户不是超级用户并且只有一个租户链接时,我使用这个剃刀视图逻辑:

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Survey</legend>

        @if (!MyUser.IsSingleTenant) {
            <div class="editor-label">
                Tenant
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(model => model.TenantID, ...
                @Html.ValidationMessageFor(model => model.TenantID)
            </div>
        }

MyUser返回当前登录的使用情况,IsSingleTenant表示她是否只链接到单个租户。

我担心这会让我的观点变得混乱,因为很多“if-then”逻辑。

其他人如何解决这个问题?

谢谢你, IDO。

1 个答案:

答案 0 :(得分:1)

这种方法没有错。您可以将这些部分放在部分视图中以使其更具可读性:

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Survey</legend>

        @if (!MyUser.IsSingleTenant) {
            @Html.Partial("Tenant")
        }

        ...
    </fieldset>
}