我想启用ASP.NET MVC 4的SimpleMembership API以与我自己的数据库架构集成。我的数据库中有一个简单而简单的表,名为Users
,其中包含以下字段:
我已经将SimpleMembership API配置为使用我的数据库:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);
我也可以插入用户:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
IsDeleted = false,
Email = "sampledata@gmail.com"
});
但是,密码字段(或它的哈希)没有插入到Users表中(当然),它插入到另一个名为webpages_Membership
的表中,该表是使用InitializeDatabaseConnection
调用创建的,并包含一个我不需要的许多不必要的信息。
另外,我还有其他自动创建的表格,名为webpages_OAuthMembership,webpages_Roles和webpages_UsersInRoles,我不需要。
我已经尝试将表生成设置为false:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);
但在这种情况下,CreateUserAndAccount调用将抛出异常,因为它找不到webpages_Membership表。
当我想使用SimpleMembership API时,看起来需要这些表。
我的问题是:当我只想要一个简单的Users
表时,我应该在这样的场景中做些什么呢?
我是否必须自己编写整个成员资格处理和身份验证逻辑(哈希码生成等)?
答案 0 :(得分:11)
我向产品团队提出了同样的问题。
SIMPLE会员资格的设计目标是尽可能简单地开箱即用。
就表格而言,实际上没有可能的定制。 建议的解决方法是仍使用ASP.NET Membership(SqlMembershipProvider)。
答案 1 :(得分:10)
可以自定义。
您可以从SimpleMembershipProvider获取the aspnetwebstack project on CodePlex的源代码,因为这是在DB Schema和运行时环境之间进行映射的地方,您可以修改此代码来修改/替换模式,语句,等,以满足您的需求(没有太多头痛,IMO。)
答案 2 :(得分:3)
1 - 您需要启用迁移,优先使用EntityFramework 5.在NuGet包管理器中使用Enable-Migrations
。
2 - 移动你的
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
到YourMvcApp / Migrations / Configuration.cs类中的Seed方法
protected override void Seed(UsersContext context)
{
WebSecurity.InitializeDatabaseConnection(
"DefaultConnection",
"UserProfile",
"UserId",
"UserName", autoCreateTables: true);
if (!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
if (!WebSecurity.UserExists("lelong37"))
WebSecurity.CreateUserAndAccount(
"lelong37",
"password",
new {Mobile = "+19725000000", IsSmsVerified = false});
if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
}
现在EF5将负责创建UserProfile表,在这样做之后,您将调用WebSecurity.InitializeDatabaseConnection仅使用已创建的UserProfile表注册SimpleMembershipProvider,同时调用SimpleMembershipProvider哪个列是UserId和UserName。我还展示了如何添加用户,角色并将Seed方法中的两者与自定义UserProfile属性/字段相关联的示例,例如用户的手机(号码)。
3 - 现在,当您从Package Manager控制台运行update-database时,EF5将为您的表配置所有自定义属性
有关其他参考资料,请参阅本文的源代码: 的 http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/ 强>
答案 3 :(得分:2)
您可以将OAUth与ASP.NET Universal Providers一起使用。通用提供程序是sqlmembership提供程序的新版本。它们基于EF CodeFirst,还可以生成更清晰的数据库模式 请查看我的以下帖子了解更多详情 http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using-universal-providers.aspx
答案 4 :(得分:2)
这可能对您的用例不起作用,但当然您可以非常轻松地将您的用户属性添加到Simplemembership UserProfile表而不是创建另一个用户表
我建议使用现有的成员资格表来保留散列密码,然后忽略您不需要的字段。这样就可以毫不费力地保持与SimpleMembership的兼容性。
SQLMembership非常容易开箱即用。我已经在几个项目上对SQLMembership进行了大量的自定义扩展,这并不困难 - 但回头看,我希望我没有。这是一种维护麻烦,
答案 5 :(得分:2)
您可以通过扩展MembershipProvider来创建自己的会员提供者。有关详细信息,请参阅Custom MembershipProvider in .NET 4.0。使用此方法,您只需要实现所需的方法。这应该有助于使事情变得更简单,并且不需要您添加不需要的表格。
基本步骤(取自链接的SO答案)是:
答案 6 :(得分:0)
您可以同时使用自定义用户表和SimpleMembership表。这种方法过去对我很有用。
例如,在AccountController中的Register方法中,您可以通过将用户添加到您自己的Users表来注册新用户。然后使用您添加到Users表的用户的Id将此用户添加到SimpleMembership UserProfile表。
using (var context = new MyDatabaseEntities())
{
User newUser = new User(){
Name = model.Name,
Email = model.Email,
IsDeleted = false
}
// Add the user to your custom Users table
context.Users.Add(newUser);
context.SaveChanges();
// Add this user to the SimpleMembership table using the same Id as the custom Users table
WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password);
// Log the user in
WebSecurity.Login(newUser.Id.ToString(), model.Password);
}