2016-12-06 3 views
0

Immer, wenn ich die Datensätze einzufügen versuchen es gibt mir Fehlermeldung für Passwort-Feld als "Arbeiten mit Passwortfeld in mvc

Den Wert‚irgendein‘ist nicht gültig für Passwort

Modell

public byte[] Password { get; set; } 

Ansicht

Beim Einchecken der Steuerung ist ModelState ungültig und eine Fehlermeldung kommt, warum ist es so? Ich habe versucht, mit DataType.Password auf Passwort-Feld, aber immer noch kein Erfolg

Die Passwort-Spalte hat den Datentyp 'Varbinary' in SQL-Server.

Jede Hilfe auf diese geschätzt!

+4

nicht Entity Entity Framework-Typen wie Viewmodel anwenden. – Dai

+0

@Dai Ich habe dich nicht verstanden. Kannst du es bitte erklären? – Rohit

+2

Erstellen Sie eine separate Klasse als ViewModel für Ihre Seite (mit einem 'String'-Kennwort-Mitglied) und schreiben Sie dann Code, der sie mit Ihrem EF-Entitätstyp lädt/speichert (z. B. das Hashing des Kennworts). – Dai

Antwort

3

Ein Passwort wird vom Benutzer nie als Byte-Array eingegeben, es wird vor dem Hashing in eins konvertiert.

Der MVC-Modellbinder hat keine eingebaute Fähigkeit, irgendeine Eingabe in ein Bytearray umzuwandeln, und obwohl Sie ein benutzerdefiniertes Modellbinder schreiben könnten, sehe ich nicht, warum Sie möchten, da ein einfacher String viel einfacher ist tippen.

Auch wenn der SQL-Typ varbinary ist, möchten Sie nicht, dass der Benutzer diese Repräsentation in Ihr Modell eingibt.

Sie sollten die Class.Password -Eigenschaft als eine Zeichenfolge festlegen, und dann in Ihrem Server-Side-Code sollten Sie das Kennwort Hashing sein.

Encoding.UTF8.GetBytes(password); wird das String-Passwort in eine byte[] konvertieren, aber es ist nicht ausreichend für sichere Passwortspeicherung.

Ich empfehle dringend, einen Blick auf https://www.asp.net/identity zu werfen, wenn Sie die Möglichkeit haben, Ihre Passwortanforderungen zu aktualisieren.

+0

Danke für die Hilfe! – Rohit

1

Was Sie schrieb funktionieren würde, wenn Klasse Model eine Eigenschaft Class genannt hat, und die Eigenschaft Class hat eine Eigenschaft Password.

Versuchen Sie, diese anstelle:

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

Auch die Password Eigenschaft in Ihrem Ansichtsmodell muss ein string sein. Sowohl das Web als auch MVC können byte[] nicht für Texteingabesteuerelemente verwenden.

Sie können speichern ein byte[] - Hashed und verschlüsselt, der beste Ansatz! - aber es kommt zuerst als eine Schnur herein.

+0

Danke für die Hilfe! – Rohit

0

Warum beginnen Sie nicht mit dem Kennwortmodell des Standardkontos und ändern es an Ihre tatsächlichen Bedürfnisse? oder Sie haben eine sehr ungewöhnliche Passwort-Anforderung, die Byte [] benötigen? ansonsten solltest du es einfach konvertieren, wenn du es wirklich brauchst ...

Modell

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

Ansicht

<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> 
Verwandte Themen