2012-01-27 60 views
1

我要尝试解决这个会员系统1个小一步来......MVC 3基本自定义成员

所以,让我们说:

步骤1,创建一个SQL数据库和在该数据库中我有一个用户表,非常简单,看起来像这样:

Users 
UserID int, identity, primary key 
UserName nvarchar(25) 
UserPassword nvarchar (25) 
UserEmail nvarchar (75) 

步骤2,创建一个新的ASP.NET MVC3 Web应用程序

第3步,我选择互联网应用templat Ë与Razor视图引擎,并检查使用HTML 5语义标记

第4步,我增加一个ADO.NET实体数据模型

第5步,在实体数据模型向导,我选择从数据库

来生成

第6步,我选择我的数据连接,并选择在Web.Config中

步骤7,保存实体连接设置,在实体数据模型向导==>选择您的数据库对象,我把表一检查,在“生成对象名称多重化或单数化”和“在模型中包含外键列”中保留缺省检查单击Finish

步骤8,我生成解决方案

第9步,我右键单击该.edmx文件并选择“添加代码生成项...”

第10步,我添加了一个新的ADO.NET DbContext生成器(然后创建所有表模型)

好吧,所以这是我不知道如何进一步使用内置的帐户/成员资格系统与我的用户表。就目前而言,无论如何,对于这个特定的项目,我不需要角色和什么,只是[授权]功能...

那么,究竟是什么,逐字符合,我需要做的当用户访问网站并注册或登录时,应用程序使用我的用户表?最终,当用户登录时,[授权]装饰将适用于我的用户群。


编辑:感谢olivehour ...下面的变化,增加真心,让这项工作...

步骤10后:(旁注:从用户表中删除的userPassword,你将不需要它)

步骤11,运行aspnet_regsql.exe工具,将ASP.NET的表添加到您的数据库。

第12步,打开您的Web.config文件,从您的EntityFramework connectionString中只复制“数据源”信息,然后粘贴并使用EntityFramework的“ApplicationServices”connectionString“数据源”替换。

步骤13,在解决方案资源管理器中,右键单击Controller目录并添加控制器。此时继续并添加您的UserController

步骤14,在AccountController中的[HttpPost]注册操作方法中,在“if(createStatus == MembershipCreateStatus。成功)”语句,添加以下内容:

TheNameOfYourEntities db = new TheNameOfYourEntities(); 
User user = new TheNameOfYourProject.User(); 
user.UserName = model.UserName; 
user.UserEmail = model.Email; 
db.Users.Add(user); 
db.SaveChanges(); 

步骤15,生成解决方案,全部保存,运行

回答

1

我们保留了内置的成员资格提供独立于我们的应用程序的用户表

我。建议使用内置的成员资格提供程序来处理用户认证,有些设置需要你做出一些决定,例如,用户名是什么?你想允许电子邮件地址作为用户名吗?如果是,你应该设置requireUniqueEmail在web.config中的提供者元素上为真(我们使用户的电子邮件地址为他们的用户名。 )

至于您使用EF创建的自定义用户表,请勿将其用于登录。用它来存储关于用户的特定于应用程序的信息。但是,为表中的行提供与成员资格提供程序数据库中的用户名相同的主键值。

因此,如果用户注册了邮件地址[email protected],您将首先执行Membership.CreateUser将它们添加到提供程序数据库中,并且在同一操作中,使用主键为您的用户表添加一行[email protected]

这样您就不必在数据库中存储任何密码加密值......您将它外包给成员供应商。当用户登录时,FormsAuthentication将编写一个cookie来维护登录状态。在控制器操作中,您可以使用代码User.Identity.Name获取用户名。使用该值作为参数,从您的自定义特定于应用程序的用户表中选择行。

+0

这个想法曾经一度让我想起这样做,但我担心它会被认为是黑客,但我越想它,其他任何方式都会如此一个黑客,我会试试看。 – 2012-01-27 13:34:13

+0

这不是黑客攻击,而且imho远比将你的appdb捆绑到成员资格提供者或尝试密码加密更清洁。在SSO世界中,将登录外包给提供商变得司空见惯,有时您无法控制。在这些情况下,您不会将密码信息存储在应用程序数据库中。 – danludwig 2012-01-27 14:46:07

+0

感谢olivehour,请查看上面的解决方案,我使用您的建议实施。 – 2012-01-27 15:00:45