2016-11-17 1 views
1

Ich bin neu in der ASP.Net-Webentwicklung und stehe bei der Handhabung der Ausnahmen fest, wenn die Anmeldung eingeschränkt ist. Frage: Ich habe Besitzer anmelden und Mieter anmelden. Jetzt Besitzer kann die Anmeldung für Mieter beschränken. Aber wenn die Anmeldung eingeschränkt ist, möchte ich dem Mieter zeigen, dass ihre Berechtigung korrekt ist, aber die Anmeldung ist eingeschränkt.So geben Sie die korrekte Fehlermeldung an den Benutzer zurück, wenn die Anmeldung eingeschränkt ist

Unten ist, was ich bis jetzt versucht habe.

-Controller

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult LoginSubmit(LoginMV userData) 
{ 
    if (userData != null) 
    { 
     UserMV authenticatedUser = AuthenticateTenant(userData.Username, userData.Password); 
     if (authenticatedUser == null) 
     { 
       ModelState.AddModelError("Invalid credentials"); 
     } 
     else 
     { 
      //Do the login 
     } 
    } 

    return View("Login", userData); 
} 

Benutzerdaten von API

private static UserMV AuthenticateTenant(string username, string password) 
     { 
      Res response = mdlAPI.AuthenticateTenant(username, password); 
     try{ 
      response.Validate(username); 
      } 

     UserMV result = new UserMV() 
      { 
       DisplayName = response.objTenant.LastName + ", " + response.objTenant.FirstName 
      }; 
      return result; 
     } 

FYI API Antwort ist response.ResultCode = Restricted.

Validate

public static void Validate(this Res response, string username) 
      { 
       if (response.ResultCode != Enumerations.AuthResultCode.Successful) 
       { 
        string additionalDetails = ""; 
        if (response.ResultCode == Enumerations.AuthResultCode.Restricted) 
        { 
         additionalDetails = "Login Restricted."; 
        } 
        throw new ValidationException(additionalDetails); 
       } 
      } 

So in dem obigen Verfahren additionalDetails auf "Login Restrcited" fertig und die Validation aufgerufen. Da die Ausnahme ausgelöst wird, wird das UserMV-Objekt auch nicht in AuthenticateTenant function erstellt.

Validation

public class ValidationException : Exception 
{ 
    public ValidationException(string message) : base (message) 
    { } 
} 

Nachdem all dies die Folge von Code kehrt zum Controller. Da userMV NULL ist, wird die angezeigte Fehlermeldung "Ungültige Anmeldeinformationen" angezeigt. Habe ich etwas verpasst?

Ich bekomme die Ausnahme ordnungsgemäß in der ValidationException-Klasse. Muss ich etwas anderes tun, damit die Ausnahme dem Benutzer angezeigt wird? Ich bin ein Anfänger, also entschuldige meine Programmierstandards. Bitte zeigen Sie mir, was ich noch tun muss, um dem Mieter die "zusätzlichen Details" anzuzeigen.

View File:

@using (Html.BeginForm("LoginSubmit", "Security", FormMethod.Post, new { id = "simLogin" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal-width-inherit"> 
     @Html.HiddenFor(model => model.ReturnUrl) 

     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" }) 
      @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label ignoreSpacing col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Username, new { @class = "form-control" }) 
      </div> 
     </div> 

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

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Login" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 
+0

Woher nehmen Sie die 'ValidationException'? – stuartd

+0

Ich weiß nicht, wie ich das fangen soll. Kannst du mich ein wenig führen? Ich würde das wirklich zu schätzen wissen. – Unbreakable

+0

Muss ich Änderungen in meinem cshtml vornehmen, um es zu fangen? Ich bin ein Anfänger, also kannst du es gut ausarbeiten. – Unbreakable

Antwort

2

Sie scheinen auf der AuthenticateTenant() zu verlassen, um die Anmeldeinformationen für Sie zu überprüfen und auch zu return das Authentifizierungsergebnis.

Aber intern rufen Sie Validate(), die ihrerseits eine Ausnahme wirft. Diese Ausnahme ändert den Kontrollfluss des Codes. Momentan ist der einzige Code, der es zu fangen scheint, entweder ein Fehlerfilter, den Sie haben, oder er wird in IIS propagiert und das generische HTTP 500 wird angezeigt.

Ich würde vorschlagen, nicht eine Ausnahme im Rahmen der AuthenticateTenant() Methode zu werfen, sondern gibt ein null (oder false, wenn Sie die Methode Signatur zu ändern bereit sind).

Sobald Sie wieder die Kontrolle über den Fluss haben, können Sie sich darauf verlassen, dass das zurückgegebene Ergebnis mit der korrekten Nachricht richtigerweise ModelState.AddModelError() aufruft.

+0

Da kann ich die Ausnahme erfassen. Können Sie mir bitte sagen, welchen Code ich hinzufügen muss, um die Antwort auf den Benutzer anzuzeigen. Wenn ich dem folge, was du vorschlägst, was nützt die Ausnahmebehandlung. Ich habe verstanden, was du sagst. Aber ich möchte sagen, dass ich die Ausnahme in meiner 'ValidationException (string message): base (message) 'richtig verstanden habe. Muss ich etwas weitere Handhabung hinzufügen, um es dem Benutzer anzuzeigen. – Unbreakable

+0

@Unbreakable, erneut, wenn eine Ausnahme ausgelöst wird, ändert sich der Kontrollfluss. Wenn Sie nach dem Auslösen der Ausnahme die Kontrolle in Ihrer Aufrufmethode behalten wollen, müssen Sie sie "fangen" und 'AddModelError()' in der 'catch {}' Klausel aufrufen. – haim770

+0

Verzeihen Sie meine Ignoranz, da ich ein Anfänger bin und immer noch neue Sachen lerne. Also werde ich eine Funktion in den Catch-Block schreiben. Ich werde den Schnitt machen und werde zu dir zurückkommen. Also muss ich im catch-Block etwas wie 'ModelState.AddModelError()' machen, oder? – Unbreakable

Verwandte Themen