2016-02-17 30 views
14

Sto provando a creare l'asp.net core mvc 6 app utilizzando l'autenticazione Cookie Middleware. Il mio codice compilato senza errori, ma anche dopo il login di successo io non sono autorizzato utenteAsp.Net MVC 6 Autenticazione cookie: mancata autorizzazione

Ecco la mia configurazione startup.cs

 app.UseCookieAuthentication(options => 
     { 
      options.AuthenticationScheme = "CookieAuth"; 
      options.LoginPath = new PathString("/Account/Login/"); 
      options.AccessDeniedPath = new PathString("/Account/Login/"); 
      options.AutomaticAuthenticate = true; 
      options.AutomaticChallenge = true; 

     }); 

login anche azione nel mio controller:

public async Task<IActionResult> Login(LoginViewModel model) 
    { 

     User foundUser = _userManager.findUser(model.UserName, model.Password); 


     if (foundUser != null) 
     { 
      List<Claim> userClaims = new List<Claim> 
      { 
       new Claim("userId", Convert.ToString(foundUser.UserID)), 
       new Claim(ClaimTypes.Name, foundUser.UserName), 
       new Claim(ClaimTypes.Role, Convert.ToString(foundUser.RoleID)) 
      }; 

      ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims)); 
      await HttpContext.Authentication.SignInAsync("CookieAuth", principal); 


      return RedirectToAction("Index", "Dashboard"); 
     } 
     return View(); 
    } 

E infine azione Dashboard/Index

[Authorize] 
public IActionResult Index() 
{ 
    return View(); 
} 

Ho messo qualche breakpoi nts in action login e tutto sembra funzionare bene. Anche il cookie è impostato correttamente.

E ora non so modo in cui io non posso andare al cruscotto/index dopo Entra. Ogni volta che sto reindirizzato a/account/Login/a causa di impostazioni di configurazione

Che cosa sto facendo sbagliato ?

risposta

17

Quando si crea il tuo ClaimsIdentity nel login, è necessario utilizzare un costruttore diverso che specifica il authenticationType.

Invece di

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims)); 

Si dovrebbe fare:

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local")); 

Ora è possibile creare un ClaimsIdentity che ha pretese, ma avendo IsAuthenticated impostata su false. In realtà questo è il default adesso ...

Aver IsAuthenticated impostata su true, è necessario specificare un tipo di autenticazione

ho ottenuto queste informazioni dal blog di Dominick Baier here.

C'è anche un ottimo esempio di utilizzo del middleware cookie here, anche da (il mitico) Dominick Baier/minimumprivilege.

EDIT:

This answer contiene più informazioni su ciò che dovrebbe essere utilizzato per la stringa authenticationType.

+2

Grazie mille! Beacause di un parametro Ho perso 2 ore della mia vita :( – Kuba

+1

Meritato il voto, grazie per la risposta! 2+ ore perse, ma almeno so perché! –

+1

Abbiamo trascorso 4 ore su questo Grazie. Cosa dovrebbe essere impostato per il parametro 'authenticationType'? È" Cookie "," JWT "o lo schema utilizzato o altro? – Omar

Problemi correlati