5

Sto tentando di implementare l'autenticazione basata su moduli nella mia applicazione. Ho vari esempi e ho guardato gli esempi e le domande fornite in questo forum e ASP.net MVC ma non riesco a farlo funzionare.Autenticazione modulo: ruoli (MVC 4) C#

riesco a autenticare il mio utente, ma i ruoli non sembra funzionare :-(

Ho installato il mio web.config come segue:

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

Nel mio controller ho impostato la pagina di indice per AllowAnonymous e poi il check-in là se l'utente è autenticato. Se poi non reindirizzamento alla pagina di login ..

[AllowAnonymous] 
    public ActionResult Index(string sortOrder, string searchString,string currentFilter, int? page) 
    { 
     if (!Request.IsAuthenticated) 
     { 

      return RedirectToAction("Login", "Account"); 

     } 
//Find all the employees 
     var employees = from s in db.Employees 
         select s; 
//Pass employees to the view (All works fine) 
return View(employees.ToPagedList(pageNumber, pageSize)); 
} 

Questo tutto funziona al 100%

Il mio codice Accesso assomiglia a questo:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(User user, string returnUrl) 
    { 
     var myUser = db.Users.Where(b => b.UserName == user.UserName).FirstOrDefault(); 
     if(myUser != null) 
     { 
      if(myUser.Password==user.Password) 
      { 
       //These session values are just for demo purpose to show the user details on master page 
       //Session["User"] = user; 
       ICollection<UserAccessLevel> levels = db.UserAccessLevels.Where(b => b.UserId == myUser.UserId).ToList(); 
       //Session["levels"] = levels; 

       //Let us now set the authentication cookie so that we can use that later. 
       FormsAuthentication.SetAuthCookie(user.UserName, false); 

       return RedirectToAction("Index","Employee"); 
      } 
     } 
     ViewBag.Message = "Invalid User name or Password."; 
     return View(user); 
    } 

Ho anche il seguente codice nel file Global.asax:

protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e) 
    { 
     if (FormsAuthentication.CookiesSupported == true) 
     { 
      if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) 
      { 
       try 
       { 
        //let us take out the username now     
        string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name; 
        string roles = string.Empty; 

        using (TrainingContext entities = new TrainingContext()) 
        { 
         User user = entities.Users.SingleOrDefault(u => u.UserName == username); 

         roles = "admin";//user.Roles; 
        } 
        //Let us set the Pricipal with our user specific details 
        e.User = new System.Security.Principal.GenericPrincipal(
         new System.Security.Principal.GenericIdentity(username, "Forms"), roles.Split(';')); 
       } 
       catch (Exception) 
       { 
        //somehting went wrong 
       } 
      } 
     } 
    } 

Quando accedo nei miei esegue FormsAuthentication_OnAuthenticate e tutto sembra a posto. Il mio utente è impostato e anche i miei ruoli nella sessione ...

Ma quando faccio clic sui dettagli della schermata Dipendente/Indice, mi riporta alla schermata di accesso (mi aspetto che mi porti al dettagli del dipendente che ho cliccato perché sono connesso e sono configurato come ruolo amministratore)

Per favore, puoi aiutarmi a provare ad arrivare al problema. Mi sono seduto per più di 18 ore già cercando di capirlo.

ho già guardato queste soluzioni e come potete vedere la maggior parte del mio codice viene da lì ... codeproject.com/Articles/578374/AplusBeginner-27splusTutorialplusonplusCustomplusF codeproject.com/Articles/342061/Understanding-ASP- NET-ruoli-e-appartenenza-a-Begin codeproject.com/Articles/408306/Understanding-and-Implementing-ASP-NET-Custom-Form

in caso di bisogno di maggiori dettagli circa il mio codice è possibile anche scaricare da GitHub https://github.com/Ruandv/Training/tree/FormsAuthentication

Apprezzerò la vostra assistenza.

+0

Puoi pubblicare il waht nella classe di attributi Authorize? –

+0

Non ho una classe di attributo Authorize personalizzata. Sto facendo uso di quello standard. – Gremlin1708

risposta

3

Se si accede al proprio database e si cerca la tabella che assegna i ruoli agli utenti (probabilmente generata da SimpleMembership?), Il proprio utente ha un ruolo di "amministratore"?

Sembra che si assegni il ruolo solo nel metodo FormsAuthentication_OnAuthenticate senza impostarlo effettivamente nel DB.

// Your method (...) 
User user = entities.Users.SingleOrDefault(u => u.UserName == username); 
roles = "admin";//user.Roles; 

E, anche se non sono del tutto sicuro, [Authorize(Roles = "admin")] potrebbe essere di utilizzare il provider di ruoli e controllando se l'utente ha/non ha il ruolo nel database.

+0

Grazie per aver segnalato la parte del database.Ho aggiunto il ruolo nel DB e tutto ha funzionato. Tutto quel tempo sprecato. – Gremlin1708

Problemi correlati