如何使用MVC Controller.User属性引用自己的表?

时间:2010-11-23 20:42:21

标签: asp.net-mvc linq-to-entities asp.net-membership

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

我很容易看到它接受用户名和密码字符串,我访问我的数据库上下文(LINQ to Entities,实际上是MySQL的dotConnect提供程序),并检查用户名和密码 - 很简单。

但是,如何让Controller.User对象使用我自己的表的属性。例如,我的表名为Staff。它有StaffID(PK),FirstName,LastName等。如何访问当前上下文用户的StaffID,如下所示?

int id = User.StaffID;

我发现Matt Wrock的这篇文章,但我真的无法理解实现User类,特别是IsInRole方法。何时构造此对象,构造函数参数来自何处?

2 个答案:

答案 0 :(得分:2)

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

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

在基本控制器中,添加一个名为CurrentUser的属性,使用您想要使用的任何类型(可能是Linq 2 Sql类型)。

覆盖基础控制器上的Initialize方法并运行逻辑以在用户通过身份验证时获取正确的用户。将CurrentUser设置为适当的用户。现在,您可以从任何继承自基本控制器的控制器中访问该属性。

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);
      }
}

答案 1 :(得分:1)

如果你想让它发挥作用,你将不得不做很多事情。

你需要定义自己的类来自

GenericIdentity

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

GenericPrincipal

此类可以包含您要引用的属性(例如StaffID)。

您需要挂钩实际的身份验证过程并将GenericPrincipal后代的实例分配给“User”属性。

然后每次你引用是否必须将它转换为你的类型才能访问其他属性。

((MyPrincipal)User).StaffID

与迄今为止你所做的工作相比,这是一项相当多的工作。

但这是可行的。

相关问题