2012-05-15 23 views
13

Im sử dụng tên lớp RightCheckerAttribute để kiểm tra sự cho phép người sử dụng trong ứng dụng MVC3 ... Vì vậy, các lớp RightCheckerAttribute là như thế này ...Sử dụng bộ lọc hành động trên MVC C# sử dụng chuỗi truy vấn

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); 
    } 

Vì vậy, trong phương pháp tôi áp dụng này có người đứng đầu là ..

[RightChecker (isAdmin=true)]

Im Thực thi phương pháp này như thế này ..

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

vấn đề đặt ra là liệu tôi đang đi đúng hay sai ... Tôi đã gây biến như sai ... Và tôi nhận được:

ngoại lệ [Null Object tài liệu tham khảo] ...

+0

Dòng nào cho bạn ngoại lệ? – gideon

+0

bool result = Convert.ToBoolean (context.Request.QueryString ["isAdmin"]. ToString()); dòng cung cấp một ngoại lệ –

+2

Kiểm tra chuỗi truy vấn để xác định xem người dùng có phải là quản trị viên không an toàn hay không. Bạn có thể muốn lưu trữ nó trong phiên làm việc. –

Trả lời

15

Có vẻ như bạn không phải đi qua các isAdmin=false hoặc isAdmin=true trong chuỗi truy vấn của bạn. Nó làm việc cho tôi. Tuy nhiên, bạn sẽ cần phải xử lý tình huống mà bạn không truyền tham số chuỗi truy vấn. Kiểm tra việc triển khai của tôi. Như đã đề cập trong phần bình luận của câu hỏi, nó không đủ an toàn để vượt qua điều này thông qua một chuỗi truy vấn.

 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 
       } 
      } 
     } 

phương pháp hành động của bạn

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

Cảm ơn bạn đã trả lời .. tht hoạt động ...: D –

+0

bạn được chào đón; mừng vì tôi có thể giúp. –

0

Có vẻ như có thể context.Request.QueryString["isAdmin"].ToString() đang gây ra một NullReferenceException.

Hãy thử

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

Tác giả đang nói rằng anh ấy đang chuyển tham số nhưng vẫn gặp lỗi. http: // localhost: 5576/Singer/DeleteSinger? isAdmin = true –

+0

@Asif Nhận xét của tác giả chỉ ra rằng 'NullReferenceException' đang được ném khi' ToString() 'được gọi. Vì vậy, tôi đoán rằng vì lý do nào đó, thông số truy vấn không được chuyển cùng. Nên có một kiểm tra cho 'null' anyway mà câu trả lời của tôi, tôi tin rằng sẽ chăm sóc. – Soliah

+0

Tôi nghĩ rằng đó là câu hỏi của anh ta tại sao nó lại vô giá trị nếu anh ta vượt qua param. –

0

đèo điều này trong Chế độ xem được hiển thị bên dưới:

public ActionResult Test(bool testParam) 
{ 
    ViewData["isAdmin"] = testParam; 
    return View(); 
} 
Các vấn đề liên quan