2016-02-17 32 views
14

Próbuję utworzyć aplikację asp.net core mvc 6 przy użyciu uwierzytelniania Cookie Middleware. Mój kod kompiluje bez błędów, ale nawet po udanym logowaniu nie jestem upoważniony użytkownikAsp.Net MVC 6 Uwierzytelnianie plików cookie - autoryzacja kończy się niepowodzeniem

Oto moje startup.cs konfiguracyjne

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

     }); 

zalogować także działania w moim kontrolera:

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

I wreszcie akcja Dashboard/Index

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

Położyłem trochę breakpoi nts w akcji logowania i wszystko wydaje się działać dobrze. Plik cookie jest również ustawiony prawidłowo.

I teraz nie wiem sposób nie mogę iść do tablicy rozdzielczej/indeksu po logowania. każdym razem jestem przekierowany/Konto/Logowanie/z powodu ustawień konfiguracyjnych

Co robię źle ?

Odpowiedz

17

Po utworzeniu w swoim loginem ClaimsIdentity należy użyć innego konstruktora, który określa authenticationType.

Zamiast

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

należy zrobić:

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

Jest teraz możliwe stworzenie ClaimsIdentity który ma roszczeń, ale po IsAuthenticated ustawiona na false. Właściwie jest to domyślny teraz ...

mieć IsAuthenticated wartość true, trzeba określić typ uwierzytelniania

mam to info z blogu Dominick Baier za here.

Istnieje również doskonały przykład używania oprogramowania pośredniego cookie here, również przez (legendarny) Dominick Baier/leastprivilege.

EDIT:

This answer zawiera więcej informacji o tym, co powinny być wykorzystywane do napisu authenticationType.

+2

Dziękuję bardzo! Ponieważ straciłem 2 godziny mojego życia :( – Kuba

+1

Zasłużony głos w górę, dziękuję za odpowiedź! 2+ godziny stracone, ale przynajmniej wiem dlaczego! –

+1

Spędziłam 4 godziny na to.Dzięki. Co powinno być ustawione dla parametru 'authenticationType'? Czy jest to plik" Cookie "," JWT "lub używany schemat, czy coś w tym stylu? – Omar

Powiązane problemy