Opracowuję aplikację internetową MVC 5 przy użyciu metody Entity Framework 5 Database First . Używam OWIN do uwierzytelniania użytkowników. Poniżej przedstawiono moją metodę logowania w kontrolerze konta.
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Jak widać, tworzę ClaimsIdentity i dodaję do niego kilka oświadczeń, a następnie przekazuję je do OWIN przy użyciu AuthenticationManager w celu wykonania logowania.
Problem, który mam, polega na tym, że nie jestem pewien, jak uzyskać dostęp do oświadczeń w pozostałej części mojej aplikacji, czy to w kontrolerach, czy w widokach Razor.
Wypróbowałem podejście wymienione w tym samouczku
Na przykład próbowałem tego w moim kodzie kontrolera, próbując uzyskać dostęp do wartości przekazanych do oświadczeń, jednak użytkownik.
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Może czegoś mi tu brakuje.
AKTUALIZACJA
Bazując na odpowiedzi Darina, dodałem jego kod, ale nadal nie widzę dostępu do roszczeń. Poniżej zrzut ekranu pokazujący, co widzę po najechaniu kursorem myszy na tożsamość.
Odpowiedzi:
Spróbuj tego:
źródło
Możesz też to zrobić:
Aktualizacja
Aby udzielić dalszych wyjaśnień zgodnie z komentarzami.
Jeśli tworzysz użytkowników w swoim systemie w następujący sposób:
Powinieneś automatycznie wypełnić niektóre roszczenia dotyczące Twojej tożsamości.
Aby dodać niestandardowe oświadczenia po uwierzytelnieniu użytkownika, możesz to zrobić w następujący sposób:
Twierdzenia można odczytać tak, jak Darin odpowiedział powyżej lub tak, jak ja.
Roszczenia są utrwalane, gdy wywołujesz poniżej przekazanie tożsamości w:
źródło
Tworzę własną rozszerzoną klasę, aby zobaczyć, czego potrzebuję, więc kiedy potrzebuję do mojego kontrolera lub widoku, dodaję użycie do mojej przestrzeni nazw, coś takiego:
W moim kontrolerze:
W mojej brzytwie:
źródło
return claim?.Value;
bo czemu nieTo alternatywa, jeśli nie chcesz przez cały czas używać roszczeń. Spójrz na ten samouczek autorstwa Bena Fostera.
Następnie możesz dodać kontroler podstawowy.
W swoim kontrolerze zrobiłbyś:
źródło
Aby dokładniej dotknąć odpowiedzi Darina, możesz przejść do swoich konkretnych roszczeń, używając metody FindFirst :
źródło
Ty też możesz to zrobić.
źródło
Pamiętaj, że aby wysłać zapytanie do IEnumerable, musisz odwołać się do system.linq.
To da ci obiekt rozszerzenia potrzebny do:
źródło
Najkrótsza i uproszczona wersja odpowiedzi @Rosdi Kasim to
Claimname
to roszczenie, które chcesz odzyskać tj. jeśli szukasz roszczenia "StreedAddress" to powyższa odpowiedź będzie wyglądać następującoźródło
Jednak lepiej jest dodać oświadczenia wewnątrz metody „GenerateUserIdentityAsync”, zwłaszcza jeśli włączona jest opcja regenerateIdentity w pliku Startup.Auth.cs.
źródło
GenerateUserIdentityAsync
była niesamowita sugestia, całkowicie ją przeoczyłem. Wielkie dzięki, Bazyli.Zgodnie z klasą ControllerBase można uzyskać oświadczenia dla użytkownika wykonującego akcję.
oto jak możesz to zrobić w 1 linii.
źródło
źródło
Użyłem go w ten sposób w moim kontrolerze podstawowym. Po prostu udostępniaj gotowe do użycia.
źródło