2013-09-30 15 views
46

Widziałem dwa następujące dostępnych wartości logicznych:Jak powinienem sprawdzić, czy użytkownik jest uwierzytelniony w MVC5?

  • System.Web.Mvc.Controller.User.Identity.IsAuthenticated
  • System.Web.Mvc.Controller.Request.IsAuthenticated

Czy jest jakaś różnica między nimi. Obaj wydają się robić to samo, więc nie jestem pewien, którego użyć.

Co chciałbym zrobić, to:

@if (User.Identity.IsAuthenticated) { 
    if (User.IsInRole("Admin")) { 
    @Html.ActionLink("Admin", "AdminController")   
    } 
} 

lub

@if (Request.IsAuthenticated) { 
    if (User.IsInRole("Admin")) { 
    @Html.ActionLink("Admin", "AdminController")   
    } 
} 

Czy którykolwiek z powyższych prac równie dobrze?

Odpowiedz

60

Nie ma różnicy. Jedyna różnica polega na tym, że jeśli użytkownik nie jest uwierzytelniony, to może on mieć wartość NULL, a zatem można uzyskać NRE, podczas gdy w drugim podejściu wewnętrznie jest to sprawdzane i bezpieczniejsze.

Oto jak metoda Request.IsAuthenticated jest realizowany:

public bool IsAuthenticated 
{ 
    get 
    { 
     return this._context.User != null && 
       this._context.User.Identity != null && 
       this._context.User.Identity.IsAuthenticated; 
    } 
} 

Zasadniczo jest to nieco bezpieczniejsze niż pierwsza.

+0

Chciałem mieć inny test: "if (User.IsInRole (" Admin ")) {}" jeśli powyższy test przeszedł pomyślnie. Czy byłoby dobrze dołączyć ten test do Request.IsAuthenticated? – Melina

+0

Nie sądzę, że trzeba owijać test w 'Request.IsAuthenticated'. Wywołanie 'if (User.IsInRole (" Admin ")) {}' powinno być w porządku. –

+0

Dziękuję, że przyjmuję odpowiedź. –

2

Właściwość IsAuthenticated w celu ustalenia, czy bieżące żądanie zostało uwierzytelnione. Jeśli nie zostało uwierzytelnione, żądanie jest przekierowywane na inną stronę, na której użytkownicy mogą wprowadzać swoje poświadczenia do aplikacji sieci Web. Jest to powszechna technika używana na domyślnej stronie aplikacji.

ale jeśli chodzi o User.Identity.IsAuthenticated

Obiekt Użytkownik zapewnia programowy dostęp do właściwości i metod interfejsu IPrincipal. Ponieważ strony ASP.NET zawierają domyślne odwołanie do przestrzeni nazw System.Web (która zawiera klasę HttpContext), można odwoływać się do członków HttpContext na stronie .aspx bez użycia w pełni kwalifikowanego odwołania do klasy HttpContext. Na przykład można użyć numeru User.Identity.Name, aby uzyskać nazwę użytkownika, dla którego działa bieżący proces. Jeśli jednak chcesz używać członków IPrincipal z modułu kodu ASP.NET, musisz dołączyć odwołanie do przestrzeni nazw System.Web w module i pełne odwołanie do bieżącego aktywnego kontekstu żądania/odpowiedzi i klasa w System.Web, której chcesz użyć. Na przykład na stronie z kodowaniem musisz podać pełną nazwę:

+0

_Jeśli nie zostało to uwierzytelnione, żądanie jest przekierowywane na inną stronę, na której użytkownicy mogą wprowadzać swoje poświadczenia do aplikacji sieci Web ... _ Nie rozumiem ... warunek nie może przekierować użytkownika użytkownika ?! – WoIIe

+1

_Funkcja User zapewnia programowy dostęp do właściwości i metod interfejsu IPrincipal._ ... Interfejs nie może zaimplementować właściwości! – WoIIe