【问题标题】:Hashed Password with EF 4.1 Database first / ASP.NET MVC 3首先使用 EF 4.1 数据库/ASP.NET MVC 3 的哈希密码
【发布时间】:2011-07-26 04:10:50
【问题描述】:

我正在推出自己的身份验证系统,并且遇到了需要指导的情况。

首先使用 EF 4.1 代码。我将我的数据库设计为包含一个带有 Id、Email 和 HashedPassword 列的用户表。然后我让 EF 根据这个表创建一个实体。然后我创建了一个部分类来处理我的验证。

问题是,在我看来,我希望有一个用于电子邮件、密码和确认密码的文本框。我需要验证密码并确认密码(必需并比较)。我可以将这些添加到我创建的验证类中,但因为它们不是为 User 表创建的实体 EF 的一部分,所以当我尝试查看页面时会出现编译器错误。

我的部分课程

[MetadataType(typeof (UserMetadata))]
    public partial class User
    {
        private class UserMetadata
        {
            [Required]
            public string Email { get; set; }

            [Required]
            public string Password { get; set; }

            [Required]
            [Compare("Password")]
            public string ConfirmPassword { get; set; }
        }
    }

我的看法

<h1>Sign Up</h1>
@using (Html.BeginForm("Create", "Users", FormMethod.Post))
{
    @Html.ValidationSummary()
    <p>
        @Html.LabelFor(x => x.Email)<br />
        @Html.TextBoxFor(x => x.Email)
    </p>
     <p>
        @Html.LabelFor(x => x.Password)<br />
        @Html.TextBoxFor(x => x.Password)
    </p>
    <p>
        @Html.LabelFor(x => x.ConfirmPassword)<br />
        @Html.TextBoxFor(x => x.ConfirmPassword)
    </p>

    <p class="button">
        <input type="submit" value="Submit" /></p>
}

我的模型

表名称:用户 列:ID、电子邮件、HashedPassword

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 可能有助于了解它是如何实现的,以了解编译错误是如何发生的。
  • Vasile Bujac 是正确的。您应该创建一个仅用于视图的模型,而不是使用您的 DataModel。然后将属性从一个映射到另一个。这允许您拥有对用户可见的属性,这些属性可能不存在于数据库中,但被使用或映射到 DataModel 中的适当列。

标签: entity-framework asp.net-mvc-3


【解决方案1】:

最直接的答案似乎是为 MVC 部分创建一个具有 PasswordConfirmPassword 字段的 ViewModel。当您真正准备好保存到数据库时,使用它来创建带有 HashedPassword 的 EF 模型版本。

也就是说,我在没有 ViewModel 的情况下使用了 EF 模型中不存在的属性,方法是在您尝试时将它们添加到部分类中。我认为问题在于您在 Metadata 类中拥有这些,而它们并不是真正的元数据。试试这个:

[MetadataType(typeof (UserMetadata))]
public partial class User
{
    [Required]
    public string Password { get; set; }

    [Required]
    [Compare("Password")]
    public string ConfirmPassword { get; set; }

    private class UserMetadata
    {
        [Required]
        public string Email { get; set; }


    }
}

此版本定义了几个新属性,然后将电子邮件上的元数据更改为添加[Required]

【讨论】:

    【解决方案2】:

    您的视图模型是用户实体本身,它没有定义 ConfirmPassword 属性。我建议您创建一个全新的视图模型类,而不是使用AutoMapper 在这两个类之间轻松映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多