2012-05-15 9 views
13

Im używając nazwy klasy RightCheckerAttribute sprawdzić uprawnienia użytkownika w aplikacji MVC3 ... Więc klasa RightCheckerAttribute jest tak ...Używanie filtrów akcji na MVC C# za pomocą string zapytanie

public bool isAdmin { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContextBase context = filterContext.HttpContext; 

     bool result = Convert.ToBoolean(context.Request.QueryString["isAdmin"].ToString()); 

     if (isAdmin != result) 
     { 
      RouteValueDictionary redirecttargetDictionary = new RouteValueDictionary(); 
      redirecttargetDictionary.Add("action", "NoPermission"); 
      redirecttargetDictionary.Add("controller","Singer"); 
      filterContext.Result = new RedirectToRouteResult(redirecttargetDictionary); 

     } 

     //base.OnActionExecuting(filterContext); 
    } 

Więc ja stosowania w metodzie to ma głowę jak ..

[RightChecker (isAdmin=true)]

Im Wykonanie tego sposobu jak ten ..

http://localhost:5576/Singer/DeleteSinger?isAdmin=true

Problemem jest to, czy jestem przechodzącej prawda czy fałsz ... Mam spowodować zmienna jako fałszywe ... I dostaję:

wyjątków [odniesienia obiektu null] ...

+0

Która linia daje wyjątek? – gideon

+0

bool result = Convert.ToBoolean (context.Request.QueryString ["isAdmin"]. ToString()); linia daje wyjątek –

+2

Sprawdzanie ciągu zapytania w celu ustalenia, czy użytkownik jest administratorem, nie jest bezpieczne. Możesz chcieć zachować to w niezazadanej sesji. –

Odpowiedz

15

Wydaje się, że nie są minięciu isAdmin=false lub isAdmin=true w ciągu kwerendy. Mi to pasuje. Będziesz jednak musiał zająć się sytuacją, w której nie przekazujesz parametru zapytania. Sprawdź moją implementację. Jak wspomniano w sekcji komentarza pytania, nie jest ona wystarczająco zabezpieczona, aby przekazać to przez ciąg zapytania.

 public class RightChecker : ActionFilterAttribute 
     { 
      public bool IsAdmin;    

      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 

       bool result = false; 
       if (filterContext.HttpContext.Request.QueryString["isAdmin"] != null) 
       { 
         bool.TryParse(filterContext.HttpContext.Request.QueryString["isAdmin"].ToString(), out result); 
       } 

       if (IsAdmin != result) 
       { 
        //your implementation 
       } 
      } 
     } 

Twoja metoda działania

[RightChecker(IsAdmin=true)] 
    public ActionResult AttCheck() 
    { 
     return View(); 
    } 
+0

Dziękuję za odpowiedź .. tht works ...: D –

+0

serdecznie zapraszamy; cieszę się, że mogłem pomóc. –

0

Wygląda na to, że prawdopodobnie context.Request.QueryString["isAdmin"].ToString() powoduje NullReferenceException.

Spróbuj

var param = context.Request.QueryString["isAdmin"] as string ?? "false"; 
var result = param == "true"; 
+0

Autor mówi, że przekazuje parametr, ale nadal otrzymuje błąd. http: // localhost: 5576/Singer/DeleteSinger? isAdmin = true –

+0

@Asif Komentarz autora wskazuje, że 'NullReferenceException' jest zgłaszany, gdy wywoływane jest' ToString() '. Zgaduję więc, że z jakiegoś powodu parametr zapytania nie jest przekazywany dalej. W każdym razie powinno być czekanie na 'null', o którym myślę, że to mi odpowiada. – Soliah

+0

Myślę, że to jest jego pytanie, dlaczego jego null, jeśli on przekazuje param. –

0

Przełęcz to w widoku danych pokazanym poniżej:

public ActionResult Test(bool testParam) 
{ 
    ViewData["isAdmin"] = testParam; 
    return View(); 
} 
Powiązane problemy