使用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方法。何时构造此对象,构造函数参数来自何处?
答案 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
与迄今为止你所做的工作相比,这是一项相当多的工作。
但这是可行的。