2010-02-05 12 views
22

Zazwyczaj chronię moje akcje za pomocą [Authorize], ale tym razem muszę sprawdzić, czy użytkownik jest autoryzowany w akcji.Jak sprawdzić, czy użytkownik jest autoryzowany w działaniu

Np

if(userIsAuthorized) { 
    //do stuff 
} 
else { 
    //return to login page 
} 

wierzę używam 'Forms Authentication'

To pytanie jest trochę podobna do this ale żadna z odpowiedzi udzielonych wydawało się do pracy.

EDYCJA: Zrobiłem więcej kopania - wydaje mi się, że jeśli złamie się działanie, które ma [Authorize], User.Identity jest ustawione, ale w Akcje bez niego, User.Identity jest pusty, nawet jeśli jestem zalogowany w

+0

Naprawiłem problem przez zastosowanie obejścia hack-ish, założę się, że twoje odpowiedzi są poprawne i jest to spowodowane moją dziwną implementacją uwierzytelniania, że ​​rzeczy są dziwne ... – elwyn

Odpowiedz

42

Jeśli chcesz tylko wiedzieć, czy użytkownik jest zalogowany:

if (User.Identity.IsAuthenticated) { ... } 

Jeśli próbujesz zrobić coś rola specyficzne:

if (User.IsInRole("Administrators")) { ... } 

Instancja User jest własnością publiczną klasa Controller, więc zawsze masz do niej dostęp z kontrolera, który piszesz. Jeśli żaden użytkownik nie jest zalogowany, musisz mieć GenericPrincipal dla User i GenericIdentity dla User.Identity, więc nie martw się o sprawdzanie wartości zerowych.

+0

Ponownie, tylko daje mi "true", jeśli jest używany w '[Authorize]' 'A Action – elwyn

+0

@elwyn: Nie sądzę, że to prawda. Właśnie przetestowałem to tutaj w akcji bez atrybutu [Authorize] 'i' User.Identity.IsAuthenticated' ma wartość 'true'. Czy jesteś pewien, że sesja jest rzeczywiście zalogowana podczas testowania tego? – Aaronaught

+0

@Aaronaught Tak, tylko podwójne (potrójne) sprawdzone, na stałe zalogowany podczas próby, i nadal widzę fałszywe – elwyn

1

Proponuję najpierw dowiedzieć się, jakiego rodzaju autoryzacji używasz. ;)

Twoja odpowiedź jest prawidłowa. Z tego co pamiętam szturchanie wokół atrybutu [Authorize] i związanego z nim kodu ActionFilter MVC wewnętrznie wywołuje stronę.User.Identity.IsAuthenticated tak jak te przykłady kodu.

+0

Podwójne sprawdzanie i to Forms Uwierzytelnienie – elwyn

3

Request.IsAuthenticated powinien działać dla tego, co próbujesz zrobić.

+3

Jeśli zrobię to w Akcji ozdobionej '[Autoryzuję]' działa dobrze, jednak jeśli zrobię to w tej Akcji (nie ozdobionej [Autoryzuję]) to zawsze jest ono fałszywe, niezależnie od tego czy jestem zalogowany czy nie . – elwyn

1

Załóż atrybutu jak poniżej: OnActionExecuting dostanie wykonany pierwszy przed innym kodem z działaniem

 public class IsAuthenticatedAttribute : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       //do your validations here. and redirect to somewhere if needed. 
       filterContext.HttpContext.Response.Redirect("/") //this will send user to home. 
      } 
     } 

na każdej akcji, gdzie trzeba sprawdzić, dodać atrybut tak:

[IsAuthenticatedAttribute] 
public ActionResult ActionName(parameters?) 
{ 
    // no need to worry about checking here. 
    //do you action things 
} 

EDYCJA: Ta nadal wykonuje akcję, a następnie tylko przekierować. Nie tak bardzo przydatne.

Powiązane problemy