2016-06-24 7 views
8

Ich habe ein Problem mit der Identität und ich bin nicht sehr vertraut damit. Vor nicht allzu langer Zeit habe ich ein neues Projekt gestartet, das ursprünglich keine Authentifizierung enthalten sollte. Als das Projekt jedoch wuchs, fanden wir heraus, dass wir es umsetzen sollten. Da es ursprünglich nicht so eingerichtet war, habe ich ein Formular für eine Anmeldung erstellt.ASP.NET Identity Integration, wenn das Projekt ohne Authentifizierung erstellt wird

fand ich die Antwort auf diese Frage und implementiert es:

How to implement custom authentication in ASP.NET MVC 5

aber es funktioniert nicht, und ich weiß nicht, warum.

Hier ist mein Code:

Es gibt nicht viel, hier zu sehen, es ist nur eine einfache Form.

@{ 
    ViewBag.Title = "Login"; 
} 

<div class="container"> 

<h2>Login</h2> 

<br /> 

@using (Html.BeginForm("Login", "Main")) 
{ 
    <div class="row"> 
     <div class="form-group col-xs-6"> 
      @Html.Label("Username", htmlAttributes: new { @class = "control-label col-sm-3" }) 
      <div class="col-sm-8"> 
       @Html.TextBox("username", null, new { @class = "form-control" }) 
       @*Html.ValidationMessageFor(model => model.EnrollmentOption, "", new { @class = "text-danger" })*@ 
      </div> 
     </div> 

     <div class="form-group col-xs-6"> 
     </div> 

    </div> 

    <div class="row"> 
     <div class="form-group col-xs-6"> 
      @Html.Label("Password", htmlAttributes: new { @class = "control-label col-sm-3" }) 
      <div class="col-sm-8"> 
       @Html.Password("password", null, new { @class = "form-control" }) 
       @*Html.ValidationMessageFor(model => model.EffectiveDate, "", new { @class = "text-danger" })*@ 
      </div> 
     </div> 

     <div class="form-group col-xs-6"> 
     </div> 

    </div> 

    <div class="row"> 
     <div class="form-group"> 
      <div class="col-md-offset-6 col-sm-5"> 
       <input type="submit" id="login" value="Sign in" class="btn btn-primary" /> 
      </div> 
     </div> 
    </div> 
} 

Die Aktion für sie implementiert ist dieses, das zählt viel mehr:

[HttpPost] 
    public ActionResult Login(string username, string password) 
    { 
     if (isLoginValid(username, password)) 
     { 
      var ident = new ClaimsIdentity(
       new[] { 
      // adding following 2 claim just for supporting default antiforgery provider 
      new Claim(ClaimTypes.NameIdentifier, username), 
      new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), 

      new Claim(ClaimTypes.Name,username), 

      // No roles needed for now... 
       }, 
       DefaultAuthenticationTypes.ApplicationCookie); 

      HttpContext.GetOwinContext().Authentication.SignIn(
       new AuthenticationProperties { IsPersistent = false }, ident); 
      return RedirectToAction("QuoteSearch"); // auth succeed 
     } 
     else 
     { 
      // invalid username or password 
      ModelState.AddModelError("", "Invalid username or password"); 
      return View(); 
     } 
    } 

Und es gibt die isLoginValid Funktion (Für jetzt ist es setzen eine hartkodierte Anmeldung verwenden)

[NonAction] 
    private bool isLoginValid(string user, string password) 
    { 
     return (user.ToLower() == "someUser" && password.ToLower() == "myPassword"); 
    } 

Ich weiß nicht sehr viel von Ansprüchen oder wie Identität darunter funktioniert. Ich habe jedoch alle notwendigen Referenzen hinzugefügt. Wenn ich nach den Login-Weiterleitungen das authorize-Attribut für meine Aktionen verwende, erhalte ich eine nicht autorisierte Anfrage von IIS. Stimmt etwas mit meinem Code nicht?

Was muss ich ändern oder beheben, um den Authorization-Teil von Identity verwenden zu können?

Danke,

+0

installieren Wenn es Abneigungen wäre es gut zu wissen, warum, bitte mindestens einen Kommentar hinterlassen. –

+2

Überprüfen Sie Ihre Startup.cs-Datei, Sie sollten einen Aufruf von services.AddIdentity (...) in der ConfigureServices-Methode haben, und ähnlich sollte in der Configure-Methode ein Aufruf von app.UseIdentity (...) erfolgen. Mein Vorschlag ist, die Beispiel-App mit Authentifizierung zu generieren und mit dem, was Sie haben, zu vergleichen. Aber es scheint wahrscheinlich, dass Sie die Dienste nicht injiziert haben. – guysherman

+0

@guysherman Das ist für ASP.Net Core, nicht für MVC5, worum es sich bei dieser Frage handelt. – DavidG

Antwort

5

Nach einiger Fehlersuche und dank guysherman Kommentar war ich in der Lage, die Lösung zu finden. Da ich die Lösung ohne Authentifizierung erstellt hatte, entfernte ich die enthaltenen Referenzen und den notwendigen OWIN-Konfigurationscode in meinem App_Start-Ordner.

Aus diesem Grund wurde nichts in Identity definiert und nichts von der Autorisierung Teil aufgetreten, trotz der Tatsache, dass die Anmeldung perfekt funktionierte. Durch Erstellen eines neuen Projekts und Hinzufügen des gesamten erforderlichen Codes zum Konfigurieren der Identität konnte ich das Attribut "Autorisieren" ordnungsgemäß verwenden. ohne irgendwelche Probleme.

(Diese Antwort gilt für ASP.NET 4.6, ich nehme an, das anders für ASP.NET-Core behandelt wird)

UPDATE:

Um diese Antwort besser zu machen ich dachte, ich sollte mehr in das, was ich erarbeiten hat getan, damit es funktioniert.

Beim Erstellen eines neuen Projekts mit Identität werden Sie sehen, dass es mehrere Dateien gibt, die nicht erstellt werden, wenn Sie es nicht hinzufügen, Sie werden diese benötigen, die meisten von ihnen werden in App_Start gespeichert.

App_Start for a normal ASP.NET Project

ich kopiert die Dateien, die ich nicht haben und verändert die Namespaces meinem aktuellen Projekt übereinstimmen. Nachdem ich das gemacht hatte, wurde mir klar, welche Pakete ich nicht hatte, also fügte ich diejenigen hinzu, die ich noch nicht hinzugefügt hatte.

Startup.Auth.cs wird die Definition für eine Schlüsselfunktion für die Identität zu arbeiten:

ConfigureAuth

Diese Funktion ist in der Startklasse aufgerufen werden muss. in der Konfigurationsmethode.

enter image description here

enter image description here

schließlich für alles, muss Folgendes enthalten Sie arbeiten auch die Datei IdentityModel.cs, die normalerweise innerhalb des Models Ordner erstellt wird. In meinem Fall platzierte ich alle Modelle in einem anderen Projekt, also platzierte ich die Klasse dort und fügte Verweise auf IdentityConfig.cs hinzu, so dass die Klasse erkennen würde, dass das IdentityModel existiert.

enter image description here

Und das war alles. In meinem Fall hatte ich viele Probleme mit der Identität, die versuchte, sich mit der db zu verbinden, um nach Benutzern zu suchen, da Identity keine Datenbank konfiguriert hatte, stürzte meine App aufgrund fehlgeschlagener db-Verbindungen ab. Das Entfernen der rot markierten Linien im dritten Bild hat es für mich funktioniert. Ich wollte die db-Verbindung der Identität nicht haben, da ich meine eigene Benutzerhandhabung habe, dies könnte nicht jemand anderes sein.

+2

FWIW, in Situationen wie diesem ist das Beste, was zu tun ist Erstellen Sie einfach ein neues Projekt * mit * individueller Authentifizierung und kopieren Sie dann den benötigten Code in Ihre Anwendung. Auf diese Weise vermisst du solche Dinge nicht. Es ist sehr schwierig, etwas wie Identität ohne ein Referenzprojekt korrekt einzurichten. –

+1

Das habe ich am Ende gemacht, vielleicht sollte ich das in meiner Antwort klarstellen. –

1

Nach viel Debugging und dank @Carlos für die aufwendige Antwort. Wenn Ihr Projekt mit "Keine Authentifizierung" erstellt wurde, müssen Sie die fehlenden Nuget-Pakete hinzufügen, die für die Authentifizierung erforderlich sind.

Sie benötigen die folgenden

Microsoft.AspNet.Identity 
Microsoft.AspNet.Identity.EntityFramework 
Microsoft.AspNet.Identity.Owin 
Microsoft.Owin.Host.SystemWeb 
Microsoft.Owin.Security 
Verwandte Themen