Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mvc中使用密码字段_C#_Asp.net Mvc_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 在mvc中使用密码字段

C# 在mvc中使用密码字段,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,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",

每当我尝试插入记录时,密码字段都会显示错误消息'

值“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>

@Html.PasswordFor(model=>model.Class.Password,新的{@Class=“form control”,@id=“txtPassword”})
签入控制器时,
ModelState
无效,出现错误消息为什么?。我尝试了密码字段上的
DataType.Password
,但仍然没有成功

密码列在sql server中的数据类型为“Varbinary”


在此感谢您的帮助

用户从不以字节数组的形式输入密码,而是在散列之前将其转换为字节数组

mvc模型绑定器没有将任何输入转换为字节数组的内置功能,即使您可以编写自定义模型绑定器,我也不明白您为什么要这样做,因为普通字符串更容易键入

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

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

Encoding.UTF8.GetBytes(密码)
会将字符串密码转换为
字节[]
但它本身不足以安全存储密码


我强烈建议您查看是否有升级密码要求的选项。

只有当类
模型
具有名为
类的属性,并且属性
具有属性
密码
时,您编写的内容才会起作用

请尝试使用此选项:

@Html.PasswordFor(model => model.Password, ...
此外,ViewModel中的
密码
属性必须是
字符串
。Web和MVC都不能对文本输入控件使用
byte[]


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

为什么不从默认帐户的密码模型开始,修改它以满足您的实际需要呢?或者您有一个非常不寻常的密码要求,需要字节[]?否则,您应该在实际需要时转换它

模型

看法


@LabelFor(m=>m.Password,新的{@class=“col-md-2控制标签”})
@Html.PasswordFor(m=>m.Password,新的{@class=“form control”})

不要将实体框架实体类型用作视图模型。@Dai我没听清楚。你能解释一下吗?为你的页面创建一个单独的类作为ViewModel(使用
字符串
密码成员),然后编写代码,用你的EF实体类型加载/保存它(例如执行密码散列)。我不知道是否确定(因此评论不回答)但我猜这是因为用户输入的密码是字符串,我怀疑model binder会自动将其转换为字节数组。在创建和保存数据库实体之前,您需要一个ViewModel,它将密码作为字符串接受,然后将其转换为字节数组(使用任何哈希或您计划使用的任何加密)。正如另一位评论者所说,大多数设计专家现在都说,您应该在视图中真正使用ViewModels,而不是直接使用DB实体。@谢谢您的帮助!谢谢你的帮助!谢谢你的帮助!
[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>