关于在.Net Mvc 4中编写自己的帐户注册方法的几个问题

时间:2012-12-11 14:54:49

标签: c# asp.net-mvc entity-framework ef-code-first

我正在尝试在Mvc 4应用程序中编写自己的帐户注册逻辑。我开始使用基本模板而不是互联网模板。目前我有一个Tenant模型,其中包含许多属性。首先使用代码我已经在我的数据库中创建了一个租户表(随着时间的推移会增加更多的模型和表 - 我只是想让一个人先工作)。

我创建了一个 RegisterTenantModel - 类似于互联网模板中的那个,除了我使用的是电子邮件而不是用户名。

public class TenantRegisterModel
{
    [Required]
    [Display(Name="Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

在我的 RegisterTenant 方法中,我想:

  • 允许用户(租户)最初仅使用电子邮件地址和密码进行注册,并且只有在他们的帐户通过电子邮件验证后才允许他们输入其租户相关的其他属性,因此使用{{ 1}}。

在致电TenantRegisterModel时,我怎么知道Membership.CreateUsermodel.Email会被添加到model.Password表中?同样,如果我正在为Tenant执行与上述相同的方案,我怎么知道输入的详细信息正被添加到Landlord表中?是否有Landlord的方法我可以指定添加用户详细信息的表格?

RegisterTenant:

Membership.CreateUser

我当然有一个上下文类,目前有public ActionResult RegisterTenant(TenantRegisterModel model) { if (ModelState.IsValid) { // Attempt to register a tenant account MembershipCreateStatus createStatus; Membership.CreateUser(model.Email, model.Password); // ... } } ,所以如果我有多个DbSets,如何知道添加用户详细信息的表格?

3 个答案:

答案 0 :(得分:2)

MVC 4不使用与MVC 3相同的成员资格。您想查找简单的成员资格。这实际上是解决为用户存储附加数据的常见问题的一个非常好的解决方案。

http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

这是一个开始阅读它的好地方。不确定您对MVC3成员资格提供程序和数据库模式的熟悉程度,但这在MVC4中已经发生了很大变化。我花了一段时间才找到所有东西。

基本上使用新设置,您可以使用您想要的任何信息创建自己的用户表,并简单地将数据库的1列映射为id(现在是int而不是(guid),如mvc3成员资格提供程序和模式)和#34;用户名"这可以是电子邮件或任何唯一标识符

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);

将连接字符串链接到数据库,它将使用该数据库创建成员资格模式。然后,您可以将模型添加到您的上下文中,并将实体框架用于dbcontext.UserProfile.FirstName等函数。

这里有一些更多的起点材料

http://patrickdesjardins.com/blog/asp-net-membership-with-mvc4

祝你好运

答案 1 :(得分:1)

您应该自己实现Membership并在web.config中将其注册为MembershipProvider。通过这种方式,您可以完全控制数据发生的变化,并且您仍然拥有所有不错的功能。

MVC3中有一个sample project实现了Code-first Membership-和Roleprovider,可以让您了解它是如何完成的。

或者,您可以使用ProfileProvider保存一些激活密钥(以及其他自定义用户字段),并将用户添加到某个角色,例如"NotActivated"

更新:据我所知,标准的Membership-Provider使用web.config中的DefaultConnection。如果在同一个数据库中使用Code-First,它将会中断,因为它的结构不是代码优先的。我认为你可以使用数据库优先。

答案 2 :(得分:0)

我怎么知道model.Email和model.Password会被添加到租户表中?

我在UserProfile模型中添加了其他属性。然后在CreateUserAndAccount方法中,我按如下方式动态传递属性:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                            new { Email = model.Email,
                                                  FirstName = model.FirstName,
                                                  LastName = model.LastName,
                                                  AccountType = model.AccountType,
                                                  DaytimeContactNumber = "",
                                                  EveningContactNumber = "" },
                                            false);

同样,如果我正在为房东做上述相同的情况,我怎么知道输入的详细信息会被添加到房东表?是否有使用Membership.CreateUser的方法我可以指定添加用户详细信息的表格?

我为房东和租户创建了角色,在Register之后,CreateUserAndAccount之后我检查了枚举AccountType的值:

if (model.AccountType == AccountType.Tenant)
                {
                    try
                    {
                        Roles.AddUserToRole(model.UserName, "Tenant");
                    }
                    catch (Exception e)
                    {
                        ModelState.AddModelError("Unable to add user to role", e);
                    }
                }