代码之家  ›  专栏  ›  技术社区  ›  David Fox

如何使用mvc controller.user属性引用自己的表?

  •  2
  • David Fox  · 技术社区  · 14 年前

    使用MVC 2项目的默认成员资格提供程序,我可以引用 User.Identity.UserName 根据它默认创建的内容。我不想这样做——想用我自己的桌子。因此,我实现了System.Web.Security.MembershipProvider类。根据网上的许多帖子,我唯一实现的就是 ValidateUser(string username, string password)

    我可以很容易地看到它接受用户名和密码字符串,我访问我的数据库上下文(linq to entities,实际上是mysql的dotconnect提供者),并检查用户名和密码——足够简单。

    但是,如何使controller.user对象使用我自己表的属性。例如,我的桌子叫做职员。它有staffid(pk)、firstname、lastname等。如何访问当前上下文用户的staffid,如下所示?

    int id = User.StaffID;
    

    我找到了MattWrock的这篇文章,但是我不能真正理解用户类的实现,特别是isinRole方法。这个对象是什么时候构造的,构造函数参数来自哪里?

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

    我不喜欢会员制提供商,所以我尽量避免不惜一切代价来处理它。以防你不使用 User 从控制器,您可以执行以下操作。

    创建一个基本控制器,并让所有控制器从中继承。

    在基本控制器中,添加名为 CurrentUser 您想要使用的任何类型(可能是Linq2 SQL类型)。

    覆盖 Initialize 方法,并运行逻辑以在用户通过身份验证时获取正确的用户。集合 当前用户 给正确的用户。现在,您可以在继承自基本控制器的任何控制器中访问该属性。

    public BaseController : Controller
    {
         public MyUserEntity CurrentUser {get; set;}
    
         protected override void Initialize(RequestContext requestContext)
         {
                CurrentUser = null;
                if (requestContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    var userRepository = new UserRepository();
                    CurrentUser = userRepository.GetUser(requestContext.HttpContext.User.Identity.Name);
                }
    
         }
    
    }
    

    要使用它:

    public StaffController : BaseController
    {
          public ActionResult View()
          {
               var staffRepository = new StaffRepository();
               var staff = staffRepository(CurrentUser.StaffID);
               return View(staff);
          }
    }
    
        2
  •  1
  •   Shiv Kumar    14 年前

    如果你想让它工作的话,你得做很多。

    您需要定义自己的类,该类从

    GenericIdentity
    

    接下来,您需要定义自己的类,该类从

    GenericPrincipal
    

    此类可以具有要引用的属性(例如staffid)。

    这就需要钩住实际的身份验证过程,并将泛型主体后代的实例分配给“用户”属性。

    然后,每次引用时,如果必须将其强制转换为您的类型,以便访问其他属性。

    ((MyPrincipal)User).StaffID
    

    与你迄今为止必须做的相比,这是一个相当多的工作。

    但这是可行的。