代码之家  ›  专栏  ›  技术社区  ›  Chris Barry

检测的是用户是每页的管理员(或任何类型)、asp.net mvc默认成员资格提供程序

  •  0
  • Chris Barry  · 技术社区  · 14 年前

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

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

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   thorkia    14 年前

    只要使用将用户对象放在上下文中的标准身份验证方法,就不会太难。在您的视图中,使用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");
      }
    }
    
        2
  •  1
  •   Community CDub    7 年前

    this 问题。

    这解决了只允许特定用户访问特定操作/控制器的问题。

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

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