2012-05-15 34 views
13

इम का उपयोग कर MVC3 आवेदन में उपयोगकर्ता की अनुमति की जांच करने के वर्ग के नाम RightCheckerAttribute के प्रयोग पर MVC सी # कार्रवाई फ़िल्टर का उपयोग करना ... तो RightCheckerAttribute वर्ग इस तरह है ...क्वेरी स्ट्रिंग

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

तो विधि में मैं लागू करने के इस के रूप में सिर ..

[RightChecker (isAdmin=true)]

इम इस रूप में इस विधि निष्पादित ..

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

समस्या

कि क्या मैं सही या गलत गुजर रहा हूँ ... मैं झूठे के रूप में चर परिणाम मिला ... और मैं हो रही है:

अपवाद [अशक्त वस्तु संदर्भ] ...

+0

कौन सा लाइन आप अपवाद देता है: अपने ViewData में यह नीचे दिखाया गया है? – gideon

+0

बूल परिणाम = कनवर्ट करें। ToBoolean (context.Request.QueryString ["isAdmin"]। ToString()); लाइन एक अपवाद –

+2

यह निर्धारित करने के लिए क्वेरी स्ट्रिंग की जांच कर रहा है कि कोई उपयोगकर्ता सुरक्षित है या नहीं। आप उस सत्र सत्र में स्टोर करना चाहेंगे। –

उत्तर

15

प्रयास करें यह आपको अपनी क्वेरी स्ट्रिंग में isAdmin=false या isAdmin=true गुजर नहीं कर रहे हैं लगता है। इससे मेरा काम बनता है। हालांकि आपको उस स्थिति को संभालने की आवश्यकता होगी जहां आप क्वेरीस्ट्रिंग पैरामीटर को पार नहीं कर रहे हैं। मेरे कार्यान्वयन की जांच करें। जैसा कि प्रश्न के टिप्पणी अनुभाग में उल्लिखित है, यह एक क्वेरी स्ट्रिंग के माध्यम से इसे पारित करने के लिए पर्याप्त सुरक्षित नहीं है।

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

आपकी कार्रवाई विधि क्वेरी स्ट्रिंग से

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

उत्तर के लिए धन्यवाद .. यह काम करता है ...: डी –

+0

आपका स्वागत है; मैं खुशी से मदद कर सकता है। –

0

ऐसा लगता है कि context.Request.QueryString["isAdmin"].ToString() शायद NullReferenceException का कारण बन रहा है।

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

लेखक कह रहा है कि वह पैरामीटर पास कर रहा है लेकिन अभी भी त्रुटि प्राप्त है। http: // localhost: 5576/सिंगर/डिलीटिंगर? isAdmin = true –

+0

@ एएसआईएफ लेखक की टिप्पणी इंगित करती है कि 'ToString()' कहा जाता है जब 'NullReferenceException' फेंक दिया जा रहा है। तो मैं अनुमान लगा रहा हूं कि किसी कारण से क्वेरी पैरामीटर पास नहीं किया जा रहा है। वैसे भी 'शून्य' के लिए एक जांच होनी चाहिए, जिस पर मेरा जवाब मेरा ख्याल रखता है। – Soliah

+0

मुझे लगता है कि यह उनका सवाल है कि अगर वह परम पास करता है तो उसका शून्य क्यों होता है। –

1

जाँच अधिकार वास्तव में सुरक्षित नहीं है। आप इस कोशिश कर सकते हैं: [कड़ी] "Security aware" action link?

लेकिन MVC 3 एपीआई परिवर्तन की वजह से, कुछ ActionIsAuthorized विधि में obsoleted कोड, आप इसे अपने आप को ठीक कर सकते हैं, को देखने के मेरे सवाल यहाँ पूछा [कड़ी] https://stackoverflow.com/questions/10545018/how-to-get-authorizationfilters-from-filterproviders

0

दर्रा

public ActionResult Test(bool testParam) 
{ 
    ViewData["isAdmin"] = testParam; 
    return View(); 
} 
संबंधित मुद्दे