在mvc中使用密码字段

时间:2016-12-06 10:04:19

标签: c# asp.net-mvc asp.net-core asp.net-core-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,但仍未成功

密码列具有数据类型&#39; Varbinary&#39;在sql server中。

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

3 个答案:

答案 0 :(得分:4)

用户从不将密码输入为字节arrray,在散列之前将其转换为密码。

mvc模型绑定器没有内置功能可以将任何输入转换为字节数组,即使你可以编写自定义模型绑定器,我也不知道你想要的原因,因为普通的字符串很多更容易打字。

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

您应该将Class.Password属性设置为字符串,然后在服务器端代码中,您应该对密码进行哈希处理。

Encoding.UTF8.GetBytes(password);会将字符串密码转换为byte[],但它自己的密码不足以进行安全密码存储。

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

答案 1 :(得分:1)

您编写的内容仅在类Model具有名为Class的属性且属性Class具有属性Password时才有效。

请尝试使用此代码:

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

此外,ViewModel中的Password属性必须为string。 Web和MVC都不能将byte[]用于文本输入控件。

您可以存储 byte[] - 哈希和加密,这是最好的方法! - 但它首先以字符串形式出现。

答案 2 :(得分:1)

为什么不从默认帐户的密码模型开始,并根据您的实际需要进行修改?或者你有一个非常不寻常的密码要求,需要byte []?否则你应该在实际需要时转换它......

模型

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