如果您的用户/身份验证表与 dbo(或任何数据库用户的默认模式)不同,我找到了另一种解决方案,那就是使用视图。
在我的数据库中,我的用户/身份验证表的范围为“安全”模式。我还有一个 Person 表所在的 Person 模式。我只在 Person 表中存储 FirstName、LastName。
我创建了一个视图,将所有表拉到一起进行身份验证,并返回以下字段:
UserId、用户名、PersonId、名字、姓氏、AuthenticationType、LastLoginDate、IsLockedOut
在我的应用程序中,我可以通过多种不同的方式对一个人进行身份验证:Form、Windows、Facebook、Twitter 等。UserId、UserName 与不同的身份验证类型相关。
这是我在 ASP.Net MVC 中的 UserProfile 类:
[Table("__vwRegisteredUser")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public String UserName { get; set; }
public int PersonId { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String AuthenticationTypeName { get; set; }
public Boolean IsLockedOut { get; set; }
public DateTime LastLoginDate { get; set; }
public int Id
{
get
{
return PersonId;
}
}
public String Name
{
get
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
}
请注意,我为 Table 属性使用了一个视图。我还将 PersonId 作为 Id 属性返回,并将 FirstName 和 LastName 连接在一起作为 Name 属性。UserName 是从我的身份验证类型(Windows 用户名、电子邮件地址(如果我使用表单身份验证)或 Facebook 或 Twitter 返回的任何内容)返回的值。因此,我的 Security.Authentication 表中的 UserName 没有一致性。
初始化数据库连接仍然需要一个表,以便 SimpleMembership 生成成员表。也许有一种方法可以拥有一个自定义会员表,但我还没有想出来。