2016-12-06 62 views
0

每当我试图插入记录它给我的错误消息密码字段为“与密码领域工作的MVC

值‘SomePassword’是无效的密码

型号

public byte[] Password { get; set; } 

查看

<label class="input"> 
<i class="icon-append fa fa-tag"></i> 
@Html.PasswordFor(model => model.Class.Password, new { @class = "form-control", @id = "txtPassword" }) 
<span asp-validation-for="Class.Password" class="text-danger"></span> 
</label> 

当在控制器中检查时ModelState是无效的,并且错误消息是为什么呢?我已经在密码字段尝试了DataType.Password,但仍然没有成功

密码列的数据类型为'Varbinary'。

对此有任何帮助表示赞赏!

+4

不要使用实体框架实体类型为的ViewModels。 – Dai

+0

@戴我没有得到你。你能解释一下吗? – Rohit

+2

为您的页面创建一个单独的类作为ViewModel(使用'String'密码成员),然后编写将您的EF实体类型加载/保存的代码(例如执行密码散列)。 – Dai

回答

3

用户从不输入密码作为字节arrray,它在散列之前被转换为一个密码。

mvc模型联编程序没有内置的能力来将任何输入转换为字节数组,即使您可以编写自定义模型联编程序,但我不明白为什么您想要,因为纯字符串更容易输入。

即使SQL类型可能是varbinary,也不希望用户在模型中输入此表示形式。

您应该将Class.Password属性设置为一个字符串,然后在您的服务器端代码中,您应该散列密码。

Encoding.UTF8.GetBytes(password);会将字符串密码转换为byte[],但它本身并不足以保护安全密码。

如果您可以选择升级您的密码,我强烈建议您查看https://www.asp.net/identity

+0

感谢您的帮助! – Rohit

1

你写什么,如果类Model有一个名为Class属性,该属性Class有一个属性Password只会工作。

尝试使用这个:

@Html.PasswordFor(model => model.Password, ... 

此外,在您的视图模型的Password财产必须是一个string。 Web和MVC都不能使用byte[]作为文本输入控件。

您可以一个byte[] - 散列和加密,最好的办法! - 但它首先以字符串形式出现。

+0

感谢您的帮助! – Rohit

0

为什么不开始使用默认帐户的密码模型,并修改它以适应您的实际需要?或者你有一个非常不寻常的密码要求,需要字节[]?否则,你应该转换它,当你真的需要......

型号

[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; } 

查看

<div class="form-group"> 
    @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) 
    </div> 
</div>