如果用户是每个页面的管理员(或任何类型),asp.net mvc默认成员资格提供程序

如果用户是每个页面的管理员(或任何类型),asp.net mvc默认成员资格提供程序,asp.net,asp.net-membership,roles,administrator,userid,Asp.net,Asp.net Membership,Roles,Administrator,Userid,我正在构建一个web应用程序,我希望在用户以管理员身份登录时,前端的某些功能可见 我使用默认的成员资格提供程序,但我有一个名为userFields的扩展表,用于存储用户设置 我刚刚在这个表中添加了一个UserType字段,现在正在考虑如何最好地在页面上获取它 我真的不想为每个控制器方法添加额外的代码,以便从数据库中获取这些信息,并将其传递出去 有没有更好的方法可以做到这一点,或者使用asp.net成员资格中的内置角色设置,或者有没有一种很酷的方法可以从我的数据库中公开此信息,方法与user.id

我正在构建一个web应用程序,我希望在用户以管理员身份登录时,前端的某些功能可见

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

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

我真的不想为每个控制器方法添加额外的代码,以便从数据库中获取这些信息,并将其传递出去


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

使用asp.net角色-然后可以在控制器上使用授权属性,以确保用户设置了相关角色

见问题

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

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

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


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

只要您使用将用户对象放置在上下文中的标准身份验证方法,就不会太难了。在您的视图中,使用Html.RenderPartial和适当的控制器来完成您想要的如下操作

/主/索引视图:

<div id="menu">
<ul>
<li>Page 1</li>
<li>Page 2</li>
<% Html.RenderPartial("/Home/AdminView"); %>
</ul>
</div>
那应该有用。。。我就是这样做的。如果是错的,希望有更聪明的人能给出更好的答案,这样我们都可以学习

编辑:

只是想到了别的。。。如果您的用户对象实现了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");
  }
}

酷这听起来很棒,我如何通过部分类def扩展users对象来添加静态方法?我还没有正确使用扩展方法,只有部分类。我通常在名为User的Models文件夹中创建自己的类,并向其中添加静态方法。
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");
  }
}
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");
  }
}