Jak zdobyć aktualnego użytkownika i jak używać klasy użytkownika w MVC5?

159
  • Jak mogę uzyskać identyfikator aktualnie zalogowanego użytkownika w MVC 5 ? Wypróbowałem sugestie StackOverflow, ale wydaje się, że nie są one przeznaczone dla MVC 5.
  • Jaka jest najlepsza praktyka MVC 5 dotycząca przypisywania rzeczy użytkownikom? (np. Userpowinien mieć Items. Czy powinienem przechowywać użytkownika Idw Item? Czy mogę rozszerzyć Userklasę o List<Item>właściwość nawigacji?

Używam „Indywidualnych kont użytkowników” z szablonu MVC.

Próbowałem tych:

„Membership.GetUser ()” ma wartość null.

Adam Szabo
źródło
Dodano odniesienia do tego, co próbowałem. Ostatni był OK w MVC4, ale nie w MVC5. Potrzebuję też dobrych praktyk „używania użytkownika” :)
Adam Szabo
Kiedy mówisz, że używasz MVC 5, czego używasz do członkostwa? Bezpieczeństwo?
Aron,
„Indywidualne konta użytkowników” z szablonu MVC.
Adam Szabo
3
HttpContext.Current.User.Identity.Nameto nazwa aktualnie zalogowanego użytkownika.
Wiktor Zychla
1
Jak zdobyć identyfikator ? Chciałbym przypisać bieżącego użytkownika do Itemtworzonego przez niego użytkownika, ale nie na podstawie nazwy użytkownika (może się to zmienić). To nie działa, ponieważ `` HttpContext.Current '' System.Web.HttpContextBase 'nie zawiera definicji dla' Current 'i nie można znaleźć metody rozszerzenia' Current 'akceptującej pierwszy argument typu' System.Web.HttpContextBase '( brakuje ci dyrektywy using lub odwołania do zestawu?) `. Czy na pewno Twoje rozwiązanie jest przeznaczone dla MVC 5?
Adam Szabo

Odpowiedzi:

313

Jeśli kodujesz w kontrolerze ASP.NET MVC, użyj

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Warto o tym wspomnieć User.Identity.IsAuthenticatedi User.Identity.Namebędzie działać bez dodawania powyższego usingstwierdzenia. Ale GetUserId()nie będzie bez niego.

Jeśli jesteś w klasie innej niż kontroler, użyj

HttpContext.Current.User.Identity.GetUserId();

W domyślnym szablonie MVC 5 identyfikator użytkownika to identyfikator GUID przechowywany jako ciąg.

Nie ma jeszcze sprawdzonych metod, ale znalazłem kilka cennych informacji na temat rozszerzania profilu użytkownika:

Adam Szabo
źródło
9
Uwierzytelnianie i autoryzacja użytkowników uległy zmianie w przypadku ASP.NET MVC 5. Teraz jest to uwierzytelnianie oparte na oświadczeniach z interfejsami i repozytoriami generycznymi, których można używać z EF lub innym dostawcą (implementacja EF jest domyślnie). Ponieważ GetUserIdjest to metoda rozszerzenia przechowywana na dole Ass_Start\IdentityConfig.cs, gdziekolwiek chcesz jej użyć, jeśli w innej przestrzeni nazw, musisz ustawić using Microsoft.AspNet.Identityrozszerzenie, aby było widoczne.
Anderson Matos
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Jeśli dodam odwołanie, użytkownik nadal jest podkreślony na czerwono? Dlaczego miałoby to być?
Zapnologica
@Zapnologica: spróbuj odbudować projekt, może VS IntelliSense działa trochę wolno.
Adam Szabo
5
UWAGA Użytkownik jest dostępny tylko w kontrolerze msdn.microsoft.com/en-us/library/… (@Zapnologica czy używasz go poza kontrolerem? Wypróbuj HttpContext.Current.User.Identity.GetUserId ();)
Adween
28

Spróbuj czegoś takiego:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Działa z RTM.

Rok Bermež
źródło
11
Nakłada niepotrzebną podróż do bazy danych.
Arash
3
@Arash, w jaki sposób aplikacja ma uzyskać obiekt użytkownika bez kontaktu z bazą danych?
fabspro
2
@ Arash nieważne, rozumiem, co masz na myśli. Identyfikator można pobrać za pomocą User.Identity.GetUserId (); bez podróży do bazy danych.
fabspro
Pamiętaj z mvc5 (członkostwo 2): User.Identity.GetUserId () różni się od identyfikatora w tabeli [AspNetUsers]. Tak więc Jakub Arnold i Rok mają rację
Gray Wolf
Jestem trochę zdezorientowany odpowiedzią. Otrzymuję typ UserStore nie istnieje w moim kontekście kontrolera. Jakieś pomysły?
Jhourlad Estrella
19

Jeśli chcesz, aby obiekt ApplicationUser był w jednym wierszu kodu (jeśli masz zainstalowaną najnowszą wersję ASP.NET Identity), spróbuj:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Będziesz potrzebować następujących instrukcji using:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
firecape
źródło
Nie znaleziono obiektu dla <ApplicationUserManager>
Fandango68
7

Uzyskanie identyfikatora jest dość proste i rozwiązałeś to.

Twoje drugie pytanie jest jednak nieco bardziej skomplikowane.

Tak więc to wszystko jest teraz przed wydaniem, ale typowy problem, z którym się spotykasz, polega na rozszerzaniu użytkownika o nowe właściwości (lub o kolekcję elementów, o którą masz pytanie).

Po wyjęciu z pudełka otrzymasz plik o nazwie IdentityModelw folderze Models (w momencie pisania). Tam masz kilka zajęć; ApplicationUseri ApplicationDbContext. Aby dodać swoją kolekcję Items, będziesz chciał zmodyfikować ApplicationUserklasę, tak jak gdyby była to normalna klasa, której używasz z Entity Framework. W rzeczywistości, jeśli spojrzysz szybko pod maskę, zobaczysz, że wszystkie klasy związane z tożsamością (użytkownik, rola itp.) Są teraz tylko POCO z odpowiednimi adnotacjami danych, więc dobrze się bawią z EF6.

Następnie musisz wprowadzić pewne zmiany w AccountControllerkonstruktorze, aby wiedział, jak używać Twojego DbContext.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Teraz uzyskanie całego obiektu użytkownika dla zalogowanego użytkownika jest trochę ezoteryczne, szczerze mówiąc.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Ta linia wykona zadanie i będziesz mógł uzyskać dostęp, userWithItems.Itemsjak chcesz.

HTH

EightyOne Unite
źródło
Nie przypuszczam, że istnieje coś takiego jak dokumenty przedpremierowe dla tego wszystkiego.
Derek Tomes,
@Derek Tomes - Nie to, że się zetknąłem. Myślę, że na prawdziwych doktorów będziemy musieli poczekać do 13 listopada. Szczerze mówiąc, nie było wspaniale, jest nawet prośba o lepsze wskazówki w uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/ ...
EightyOne Unite
ok, ale jak dostać się do instancji typu AccountController?
gniazdo
0

Czuję twój ból, próbuję zrobić to samo. W moim przypadku chcę tylko wyczyścić użytkownika.

Utworzyłem podstawową klasę kontrolera, z której dziedziczą wszystkie moje kontrolery. W nim nadpisuję OnAuthenticationi ustawiamfilterContext.HttpContext.User to null

To najlepsze, co udało mi się do tej pory ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}
Derek Tomes
źródło
0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;
Hari Lakkakula
źródło
Prosimy nie pisać po prostu kodu pocztowego, zwłaszcza bez komentarzy. Jeśli wyjaśnisz swój kod, byłoby to bardziej pomocne.
Ali Kanat
0

jeśli ktokolwiek ma taką sytuację: tworzę weryfikację e-mail, aby zalogować się do mojej aplikacji, więc moi użytkownicy nie są jeszcze zalogowani, jednak skorzystałem z poniższego, aby sprawdzić, czy adres e-mail wprowadzony przy logowaniu jest odmianą rozwiązania @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

będziesz potrzebować również:

using Microsoft.AspNet.Identity;

i

using Microsoft.AspNet.Identity.Owin;
Duan Walker
źródło
0

W .Net MVC5 core 2.2 używam HttpContext.User.Identity.Name. U mnie to zadziałało.

Bhupinder Yadav
źródło
0

W ten sposób otrzymałem identyfikator AspNetUser i wyświetliłem go na mojej stronie głównej

W metodzie HomeController Index () umieściłem następujący kod

ViewBag.userId = User.Identity.GetUserId();

Na stronie widoku po prostu zadzwoń

ViewBag.userId 

Uruchom projekt, a będziesz mógł zobaczyć swój identyfikator użytkownika

kelvin nyadzayo
źródło