2013-08-26 24 views
138
  • Jak mogę uzyskać identyfikator aktualnie zalogowanego użytkownika w MVC 5? Próbowałem sugestie StackOverflow, ale wydaje się, że nie są one dla MVC 5.
  • Co to jest najlepsza praktyka MVC 5 przypisywania rzeczy do użytkowników? (Np User powinien mieć Items. Czy mogę przechowywać użytkownika Id w Item? Czy mogę rozszerzyć klasę User z własności List<Item> nawigacji?

używam „Indywidualne Konta użytkowników” z szablonu MVC.Jak uzyskać bieżącego użytkownika i jak używać klasy użytkownika w MVC5?

Tried to:

'Membership.GetUser()' jest puste.

+0

Dodano odniesienia do tego, co próbowałem. Ostatnia była OK w MVC4, ale nie w MVC5. Potrzebuję także najlepszej praktyki "używania użytkownika" :) –

+0

Kiedy mówisz, że używasz MVC 5, czego używasz do członkostwa? OWin.Security? – Aron

+0

"Indywidualne konta użytkownika" z szablonu MVC. –

Odpowiedz

278

Jeśli kodowanie w ASP.NET MVC kontrolera, należy

using Microsoft.AspNet.Identity; 

... 

User.Identity.GetUserId(); 

Warto wspomnieć, że User.Identity.IsAuthenticated i User.Identity.Name będzie działać bez dodawania ww using oświadczenie. Ale bez niego nie będzie istnieć GetUserId().

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

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

W domyślnym szablonie MVC 5, identyfikator użytkownika jest GUID przechowywane jako ciąg znaków.

No ale najlepsze praktyki, ale znalazłem kilka cennych informacji na temat rozszerzenia użytkownika:

+8

Uwierzytelnienie użytkownika i autoryzacja zostały zmienione dla ASP.NET MVC 5. Teraz jest to uwierzytelnianie oparte na roszczeniach z interfejsami i rodzajowymi repozytoriami, których można używać z EF lub innym dostawcą (implementacja EF jest domyślnie). Ponieważ 'GetUserId' jest metodą rozszerzenia przechowywaną na dole' Ass_Start \ IdentityConfig.cs', gdziekolwiek jej potrzebujesz, jeśli w innym obszarze nazw, będziesz musiał ustawić 'using Microsoft.AspNet.Identity' for rozszerzenie, aby stać się widocznym. –

+1

survey.UserId = Guid.Parse (User.Identity.GetUserId()); – NicoJuicy

+0

Jeśli dodaję wykorzystanie odniesienia Użytkownik jest nadal podkreślony na czerwono? Dlaczego miałoby to być? – Zapnologica

7

Uzyskanie Id jest całkiem proste i rozwiązałeś to.

Twoje drugie pytanie jest jednak nieco bardziej zaangażowane.

W tej chwili jest to wszystko w wersji wstępnej, ale typowym problemem, przed którym stoisz, jest rozszerzenie użytkownika o nowe właściwości (lub kolekcja Przedmiotów w Twoim pytaniu).

Po wyjęciu z pudełka otrzymasz plik o nazwie IdentityModel w folderze Modele (w chwili pisania). Tam masz kilka zajęć; ApplicationUser i ApplicationDbContext.Aby dodać kolekcję Items, należy zmodyfikować klasę ApplicationUser, tak jak w przypadku normalnej klasy używanej w Entity Framework. W rzeczywistości, jeśli spojrzysz pod maską, zobaczysz, że wszystkie klasy związane z tożsamością (User, Role itp.) Są teraz tylko POCO z odpowiednimi adnotacjami danych, więc grają dobrze z EF6.

Następnie należy wprowadzić pewne zmiany w konstruktorze AccountController, aby wiedział on, że używa DbContext.

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

Teraz uzyskanie całego obiektu użytkownika dla zalogowanego użytkownika jest trochę ezoteryczne, aby być szczerym.

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

Ta linia będzie to zadanie i będziesz mieć dostęp userWithItems.Items jak chcesz.

HTH

+0

Nie przypuszczam, że istnieje coś takiego jak dokumenty przedpremierowe dla tego wszystkiego? –

+0

@Derek Tomes - Nie, żebym spotkała. Sądzę, że będziemy musieli poczekać do 13 listopada na prawdziwe dokumenty. Szczerze mówiąc, nie było wspaniale, jest nawet prośba o lepsze wskazówki na stronie uservoice - http://aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/4148568-better-guidance-documentation-on -mvc-5 – Stimul8d

+0

ok, ale jak dostać się do instancji typu 'AccountController'? – nest

0

czuję ból, staram się robić to samo. W moim przypadku chcę wyczyścić użytkownika.

Utworzono klasę kontrolera podstawowego, z której wszystkie moje kontrolery dziedziczą. W nim zastąpić OnAuthentication i ustawić filterContext.HttpContext.User to null

to najlepsza udało mi się daleko ...

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; 
     } 
    } 
    ... 
} 
26

Spróbuj coś takiego:

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

Works with RTM.

+11

Nakłada niepotrzebną wycieczkę do bazy danych. – Arash

+2

@Arash, w jaki sposób aplikacja ma pobrać obiekt użytkownika bez kontaktu z bazą danych? – fabspro

+2

@Arash nieważne, rozumiem co masz na myśli. Identyfikator można pobrać przy pomocy User.Identity.GetUserId(); bez żadnej podróży do bazy danych. – fabspro

14

Jeśli chcesz obiekt ApplicationUser w jednej linii kodu (jeśli masz najnowszą Tożsamość ASP.NET zainstalowany), spróbuj:

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

Musisz następujące pomocą instrukcji:

using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
Powiązane problemy