0

我正在构建一个 Web 应用程序,并且我想在用户以管理员身份登录时使前端的某些功能可见。

我使用的是默认会员提供程序,但我有一个名为 userFields 的扩展表,用于存储用户设置。

我刚刚在此表中添加了一个 UserType 字段,现在正在考虑如何最好地在页面上获取它。

我真的不想为每个控制器方法添加额外的代码来从数据库中获取这些信息并传递它。

有没有更好的方法来做到这一点,或者使用 asp.net 成员资格中的内置角色设置,或者有一种很酷的方法可以从我的数据库中公开这些信息,就像 user.identity.name 的工作方式一样,或者(用户.Identity.Name).ProviderUserKey;

4

2 回答 2

1

使用 asp.net 角色 - 然后您可以在控制器上使用授权属性来确保用户具有相关角色集。

看到这个问题。

这解决了仅允许某些用户访问某些操作/控制器的问题。

它并不能解决仅使某些功能“可见”的问题。为此,您需要创建不同的视图(或部分视图),并且您的控制器根据角色选择要呈现的视图 - 或者您将角色特定的逻辑直接写入您的视图中。

当然,如果您将用户的标志存储在单独的表中,您可以根据自己的数据完成所有这些操作。编写您自己的授权属性(即授权过滤器),并使用您自己的数据来驱动视图——只需将其作为视图数据的一部分传递给视图——就像模型的任何其他部分一样。

您说您不想编写代码来将数据通过控制器传递到视图 - 但这就是控制器的用途 - 这就是它们存在的原因。您可以编写一个静态方法 - 或某种类型的服务,直接从视图访问数据库,绕过控制器,但您也可以回到 webforms。

于 2010-11-10T00:50:42.147 回答
1

只要您使用将用户对象置于上下文中的标准身份验证方法,就不会太难。在你看来,使用 Html.RenderPartial 和适当的控制器来完成你想要的这样......

/首页/索引视图:

<div id="menu">
<ul>
<li>Page 1</li>
<li>Page 2</li>
<% Html.RenderPartial("/Home/AdminView"); %>
</ul>
</div>

/首页/管理视图:

<li>Admin 1</li>
<li>Admin 2</li>

/共享/空视图:

<!--Empty view for non-viewable admin stuff-->

/家庭控制器:

public ActionResult AdminView()
{
  //Check if user is admin
  //This should be your own logic... I usually have a few static methods that the 
  //Users or User object has to assist with checking
  if (Models.User.IsAdmin(HttpContext.User.Identity.Name))
  {
    return View();
  }
  else
  {
    return View("Empty");
  }
}

这应该工作......我就是这样做的。如果错了,希望更聪明的人发布更好的答案,这样我们都可以学习

编辑:

只是想到了别的东西...如果您的用户对象实现了 IPrincipal,您可以从上下文中提取它,将其转换为您的用户类型并在用户类中拥有信息...

有点像这样

class User : IPrincipal
{
  //Implement IPrincipal stuff
  public string Role { get; set; }
}

然后管理视图逻辑可能如下所示:

public ActionResult AdminView()
{
  //Check if user is admin
  //This should be your own logic... I usually have a few static methods that the 
  //Users or User object has to assist with checking
  if ( ((Model.User)HttpContext.User).Role =="Admin" )
  {
    return View();
  }
  else
  {
    return View("Empty");
  }
}
于 2010-11-10T01:12:22.220 回答