2012-12-14 12 views
18

में कस्टम IActionFilter के लिए अनधिकृत मैं एएसपीनेट वेबएपीआई के साथ काम कर रहा हूं और मुझे एक कस्टम एक्शनफ़िल्टर बनाने की ज़रूरत है जो यह देखने के लिए एक त्वरित जांच करता है कि यूआरआई का अनुरोध करने वाला उपयोगकर्ता वास्तव में डेटा वापस प्राप्त करने में सक्षम होना चाहिए या नहीं।वापसी स्थिति कोड वेबएपीआई

उन्हें पहले से ही मूल लेख के माध्यम से वेब सेवा का उपयोग करने के लिए अधिकृत किया गया है और उनकी भूमिका को कस्टम भूमिका प्रदाता के माध्यम से सत्यापित किया गया है।

आखिरी चीज़ जो मुझे करने की ज़रूरत है, यह जांचना है कि उन्हें उनके यूआरआई में पैरामीटर के साथ अनुरोध करने वाले डेटा को देखने की अनुमति है।

यहाँ मेरी कोड है:

public class AccessActionFilter : FilterAttribute, IActionFilter 
    { 

     public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>> continuation) 
     { 

      var result = //code to see if they have permission returns either 0 or 1 

      if (result==0) { 
       throw new ArgumentException("You do not have access to this resource"); 
      } 
      return continuation(); 
     } 
    } 

वर्तमान में मैं सिर्फ एक त्रुटि जो है मैं क्या नहीं करना चाहता, मैं नहीं बल्कि System.Net.HttpStatusCode.Unauthorized वापसी चाहते हैं फेंक लेकिन मैं विधि मैं अधिभावी रहा द्वारा एक छोटे से इस बात से नाराज हूँ और मैं क्या कर वास्तव में इसे पूरी तरह से समझ में नहीं आता है।

मैं उस मूल्य को वापस करने के बारे में कैसे जाउंगा?

+0

के बाद प्राधिकरण सिर्फ लापता नहीं, बल्कि एक पहचान प्रदान की गई है, लेकिन उपयोगकर्ता का उपयोग, उचित नहीं है HTTP प्रतिक्रिया 403 निषिद्ध है। –

उत्तर

27

आप शायद अपवाद के लिए सबसे अच्छा चिपक रहे हैं लेकिन HttpResponseException का उपयोग कर जो एक एचटीपी स्थिति कोड भी वापस कर देगा।

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 

अच्छा प्रश्न here इस बारे में।

पेज।

यह आसान हो सकता/क्लीनर को लागू करने के ActionFilterAttribute

public class AccessActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var result = //code to see if they have permission returns either 0 or 1 

     if (result==0) 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 
     } 
     base.OnActionExecuting(actionContext); 
    } 

}

+2

यह HTTP 1.1 का उल्लंघन करता है। यह एक [401 त्रुटि] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) स्वीकार्य योजना को इंगित करने के लिए 'WWW- प्रमाणीकरण' प्रदान करना होगा। 'ApiController.Unuthorized' के लिए एक पैरामीटर है। सौभाग्य से, यह 403 निषिद्ध के साथ कोई समस्या नहीं है। –

+0

अपवाद फेंकना महंगा है, इसलिए क्या यह सर्वर पर हमला करने के लिए कई अमान्य प्रयास भेजकर और सर्वर पर लोड को HttpResponseExceptions के ऊपरी हिस्से से लोड करना आसान बनाता है? या शायद कई अनुरोधों से बैंडविड्थ बोतल की गर्दन है वैसे भी इससे कोई महत्वपूर्ण प्रभाव नहीं पड़ेगा? – BornToCode

+0

@BornToCode इस तरह के सभी अपवादों को HttpControllerDispatcher (http://chimera.labs.oreilly.com/books/1234000001708/ch12.html#_apicontroller_processing_model) में पकड़ा जाएगा, विशेष रूप से HttpResponseException के लिए विशेष रूप से देखने के लिए एक सरल सरल प्रयास पकड़ में - मैं नहीं हूं सुनिश्चित करें कि वे वास्तव में कितने महंगे होने की संभावना रखते हैं - हमेशा के रूप में मैं इसे दोहन और मापने में परीक्षण करने का सुझाव दूंगा - अगर अंतर एक मुद्दा होगा तो मुझे आश्चर्य होगा - http://stackoverflow.com/questions/ पर एक झांक लें 891217/कितना महंगा-अपवाद-इन-सी यह तय करने के लिए कि क्या अपवाद वास्तव में "महंगे" हैं –

संबंधित मुद्दे