2016-06-24 60 views
8

Ho un problema con Identity e non ho molta familiarità con esso. Non molto tempo fa ho avviato un nuovo progetto che inizialmente non era destinato ad avere alcuna autenticazione collegata ad esso. Tuttavia, con la crescita del progetto, abbiamo scoperto che dovremmo implementarlo. Dal momento che non è stato originariamente impostato in questo modo, ho creato un modulo per l'accesso.Identità identità ASP.NET quando il progetto viene creato senza autenticazione

ho trovato la risposta a questa domanda e attuato:

How to implement custom authentication in ASP.NET MVC 5

Tuttavia non funziona e non so perché.

Ecco il mio codice:

Non c'è molto da vedere qui è solo una forma semplice.

@{ 
    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> 
} 

L'intervento eseguito perché è questo, questo conta molto di più:

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

E c'è la funzione isLoginValid (per ora è impostato per utilizzare un account di accesso hardcoded)

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

Non so molto delle affermazioni o di come l'identità lavori al di sotto. Mi sono assicurato di aggiungere comunque tutti i riferimenti necessari. Quando si utilizza l'attributo authorize sulle mie azioni dopo il reindirizzamento del login, ottengo una richiesta non autorizzata da IIS. C'è qualcosa che non va nel mio codice?

Cosa devo modificare o correggere per poter utilizzare la parte di autorizzazione di Identity?

Grazie,

+0

Se ci sono antipatie sarebbe bene sapere perché, si prega di almeno lasciare un commento. –

+2

Controlla il tuo file Startup.cs, dovresti avere una chiamata a services.AddIdentity (...) nel metodo ConfigureServices, e allo stesso modo nel metodo Configure dovrebbe esserci una chiamata a app.UseIdentity (...). Il mio suggerimento è di generare l'app di esempio con l'autenticazione e confrontarla con ciò che si ha. Ma sembra probabile che tu non abbia i servizi iniettati. – guysherman

+0

@guysherman Questo è per ASP.Net Core, non per MVC5, di cui tratta la domanda. – DavidG

risposta

5

Dopo un po 'la risoluzione dei problemi e grazie al commento di guysherman sono stato in grado di trovare la soluzione. Poiché avevo creato la soluzione senza autenticazione, ho rimosso gli include di riferimenti e il codice di configurazione OWIN necessario nella mia cartella App_Start.

A causa di ciò, non è stato definito nulla in Identity e nulla dalla parte di autorizzazione si è verificato nonostante il fatto che il login funzionasse perfettamente. Creando un nuovo progetto e aggiungendo tutto il codice necessario per configurare Identity, ero in grado di utilizzare correttamente l'attributo Authorize. senza alcun problema.

(Questa risposta vale per ASP.NET 4.6, suppongo che questo è gestito in modo diverso per ASP.NET Core)

UPDATE:

Per rendere la risposta migliore ho pensato di elaborare più in quello che ha fatto per farlo funzionare.

Quando crei un nuovo progetto con identità, vedrai che ci sono diversi file che non vengono creati se scegli di non aggiungerlo, ne avrai bisogno, la maggior parte di essi sono memorizzati in App_Start.

App_Start for a normal ASP.NET Project

Ho copiato il file non ho avuto e cambiato gli spazi dei nomi per abbinare il mio progetto vero e proprio. Una volta fatto questo è stato reso evidente quali pacchetti di nuget mi mancavano, quindi ho aggiunto quelli che non avevo ancora aggiunto.

Startup.Auth.cs avranno la definizione per una funzione chiave per l'identità di lavorare:

ConfigureAuth

Questa funzione deve essere chiamata nella classe di avvio. nel metodo di configurazione.

enter image description here

enter image description here

Infine, per tutto funzioni, è necessario includere anche i IdentityModel.cs file creato normalmente all'interno della cartella modelli. Nel mio caso, ho inserito tutti i modelli in un progetto diverso, quindi ho inserito la classe e aggiunto riferimenti su IdentityConfig.cs in modo che la classe riconoscesse che IdentityModel esiste.

enter image description here

E questo è tutto. Nel mio caso ho avuto un sacco di problemi con l'identità cercando di connettermi al db per cercare gli utenti, dal momento che Identity non aveva un database configurato, la mia app ha iniziato a bloccarsi a causa di connessioni db non riuscite. Rimozione delle linee contrassegnate con il rosso nella terza immagine ha funzionato per me. Non volevo la connessione db dell'identità poiché ho la mia gestione personale, questo potrebbe non essere il caso di qualcun altro.

+2

FWIW, in situazioni come questa, la cosa migliore da fare è crea semplicemente un nuovo progetto * con * auth individuale, quindi copia il codice necessario nella tua applicazione. In questo modo, non ti perdi cose come questa. È molto difficile impostare qualcosa come Identity correttamente senza un progetto di riferimento. –

+1

Questo è quello che ho fatto alla fine, forse dovrei chiarirlo nella mia risposta. –

1

Dopo tanto debugging e grazie a @Carlos per l'elaborata risposta. Se il progetto è stato creato con "Nessuna autenticazione", è necessario aggiungere i pacchetti Nuget mancanti richiesti dall'autenticazione.

È necessario installare il seguente

Microsoft.AspNet.Identity 
Microsoft.AspNet.Identity.EntityFramework 
Microsoft.AspNet.Identity.Owin 
Microsoft.Owin.Host.SystemWeb 
Microsoft.Owin.Security 
Problemi correlati