7

Attualmente sto imparando MVC4 e sto seguendo il libro 4a edizione di Pro ASP NET MVC4 per creare un progetto di negozio sportivo.MVC 4 Autenticazione moduli non funzionante con [Autorizza]

Ho sempre sviluppato in Webform e sto cercando di capire come funziona l'autenticazione dei moduli in MVC4.

Ecco quello che ho raggiunto:

Web.Config

<authentication mode="Forms"> 
<forms loginUrl="~/Account/Login" timeout="2880"/> </authentication> 

AccountController login Azione:

[HttpPost] 
     public ActionResult Login(LoginViewModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (authProvider.Authenticate(model.UserName, model.Password)) 
       { 
        return Redirect(returnUrl ?? Url.Action("Index", "Admin")); 
       } 
       else 
       { 
        ModelState.AddModelError("", "Incorrect username or password"); 
        return View(); 
       } 
      } 
      else 
      { 
       return View(); 
      } 
     } 

Auth Provider:

public bool Authenticate(string username, string password) { 
      bool result = FormsAuthentication.Authenticate(username, password); 
      if (result) 
      { 
       FormsAuthentication.SetAuthCookie(username, false); 
      } 

      return result; 

     } 

io pongo l'authCookie e ora vorrei sapere, come proteggere altri controller e azioni fuori dal AccountController

L'applicazione ha un controller chiamato AdminController , dove è possibile modificare i prodotti e la lista
prodotto con la seguente {regolatore/azione}

Admin/Indice

Quindi, se io non sono missunderstanding la teoria, se l'utente non sta registrando nel AccountController non dovrebbero essere in grado di chiamare le azioni con [Autorizza] tag sulla dichiarazione:

public class AdminController : Controller 
    { 
     private IProductRepository repository; 


     public AdminController(IProductRepository repo) 
     { 
      repository = repo; 
     } 

     [Authorize] 
     public ActionResult Index() 
     { 

      return View(repository.Products); 
     } 
    } 

Il problema è che posso chiamare l'azione Index di Admin Controller senza alcun problema e senza introdurre il login.

Ho bisogno di una guida per capire come funziona. Ho fatto delle ricerche e non ho trovato nulla, e il libro non copre questo argomento.

Grazie in anticipo.

MODIFICA: ho chiuso il browser Chrome e ho lavorato senza modificare nulla. Stavo lavorando con le schede e immagino che il cookie fosse attivo anche durante l'arresto e l'avvio del debug.

+0

quale versione di Visual Studio stai usando? 2010 o 2012? –

risposta

9

Se un azione del controller è decorato con l'attributo [Authorize] (come è il vostro Admin/Index azione), non è possibile richiamare questa azione se non si dispone di un cookie di autenticazione moduli valido nella richiesta.

Anche nell'azione Login, dopo aver eseguito correttamente l'autenticazione non è necessario restituire una vista ma è necessario reindirizzare, in modo che il cookie sia impostato correttamente e disponibile nelle richieste successive.

Ecco cosa dovrebbe accadere quando un utente non autenticato tenta di accedere all'azione protetta Admin/Index.L'attributo [Authorize] genererà un'eccezione 401, che come saprai dai classici WebForm verrà intercettata dal modulo Autenticazione moduli e verrai reindirizzato allo configurato nel tuo web.config passando un parametro stringa di query ReturnUrl la risorsa protetta inizialmente richiesta .

Quindi è necessario disporre di un'azione Login sul controller di account non decorato con l'attributo [HttpPost] e che dovrebbe servire la vista che contiene la vista di accesso. La richiesta sarà simile a questa:

/Account/Login?ReturnUrl=%2Fadmin%2Findex 
+4

Crap, ho chiuso il browser e pulito la cache e ora funziona senza modificare nulla –

+1

Sì, forse hai lasciato alcuni cookie di autenticazione moduli da una sessione precedente. –

+1

Sei l'unico che ha aiutato e spiegato molto bene. Risposta così accettata. Grazie mille –

Problemi correlati