每当我尝试插入记录时,它都会向我提供密码字段的错误消息'
价值' 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中。
对此有任何帮助表示赞赏!
答案 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>