2011-05-01 15 views
8

लौटाता है मेरे पास एक एमवीसी 3 एप्लीकेशन है, और मेरे नियंत्रक कार्यों को [अधिकृत] विशेषता का उपयोग करके सुरक्षित किया जाता है। अब तक, बहुत अच्छा, फॉर्म बनाता है महान काम करता है। अब मैं अपने आवेदन में एक JSON एपीआई जोड़ना चाहता हूं ताकि कुछ क्रियाएं गैर-ब्राउज़र क्लाइंट के लिए पहुंच योग्य हों।एएसपी.नेट एमवीसी नियंत्रक कार्रवाई को सुरक्षित करना जो JSON

मुझे 'दाएं' डिज़ाइन को समझने में परेशानी हो रही है।

1) प्रत्येक उपयोगकर्ता के पास गुप्त API कुंजी है।

2) उपयोगकर्ता आईडी 5 कॉल http://myapp.com/foocontroller/baraction/5?param1=value1&param2=value2&secure_hash=someValue। यहां, safe_hash केवल param1 का SHA1 हैश और उपयोगकर्ता के लिए गुप्त एपीआई कुंजी के साथ param2 के मानों को जोड़ा गया है

2)/फ़ोकोकंट्रोलर/बैक्शन [कस्टम प्राधिकरण] के साथ सजाया जाएगा। यह AuthorizeAttribute का कार्यान्वयन होगा जो जांच करेगा कि अनुरोध JSON के रूप में आ रहा है या नहीं। यदि ऐसा है, तो यह हैश की जांच करेगा और देखें कि यह मेल खाता है या नहीं। अन्यथा, अगर अनुरोध HTML है, तो मैं मौजूदा प्रमाणीकरण में कॉल करता हूं।

मुझे यकीन नहीं है कि यह काम करेगा या नहीं। क्या क्वेरी स्ट्रिंग में एक सुरक्षित हैश पास करना सामान्य है या क्या मुझे इसे HTTP शीर्षलेख के रूप में पास करना चाहिए? गुप्त एपीआई कुंजी का उपयोग कर हैश के बजाय HTTP मूल ऑथ का उपयोग करना बेहतर है?

एएसपी.नेट एमवीसी का उपयोग कर वेब एपीआई बनाने वाले किसी भी व्यक्ति से टिप्स का स्वागत होगा!

उत्तर

11

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

  1. क्लाइंट myapp.com/authorize कॉल करता है जो ऑथ टोकन लौटाता है।
  2. क्लाइंट स्थानीय रूप से ऑथ टोकन स्टोर करता है।
  3. क्लाइंट myapp.com/anycontroller को कॉल करता है, प्राधिकरण शीर्षलेख में लिखा गया है।

प्राधिकरण नियंत्रक नियंत्रक से विरासत में मिलता है। कोई भी नियंत्रक एक कस्टम बेस नियंत्रक से विरासत में आता है जो प्राधिकरण कोड करता है।

मेरे उदाहरण के लिए निम्न मार्ग की आवश्यकता है जो किसी भी नियंत्रक में पोस्ट नामक एक्शन रिसेट को पोस्ट अनुरोधों को निर्देशित करता है। मैं इसे सामान्य विचार देने के लिए जितना संभव हो सके इसे सरल बनाने के लिए हाथ में टाइप कर रहा हूं। कट और पेस्ट और यह काम :)

routes.MapRoute(
    "post-object", 
    "{controller}", 
    new { controller = "Home", action = "post" {, 
    new { httpMethod = new HttpMethodConstraint("POST")} 
); 

आपका प्रमाणन नियंत्रक का उपयोग कर सकते हैं इस

public class AuthorizationController : Controller 
{ 
    public ActionResult Post() 
    { 
     string authBody; 
     var request = ControllerContext.HttpContext.Request; 
     var response = ControllerContext.HttpContext.Response; 

     using(var reader = new StreamReader(request.InputStream)) 
      authBody = reader.ReadToEnd(); 

     // authorize based on credentials passed in request body 
     var authToken = {result of your auth method} 

     response.Write(authToken); 

    } 
} 

आपका अन्य नियंत्रकों एक आधार नियंत्रक

public class BaseController : Controller 
{ 
    protected override void Execute(RequestContext requestContext) 
    { 
     var request = requestContext.HttpContext.Request; 
     var response = requestContext.HttpContext.Response; 

     var authToken = Request.Headers["Authorization"]; 

     // use token to authorize in your own method 
     var authorized = AmIAuthorized(); 

     if(authorized = false) { 
      response.StatusCode = 401; 
      response.Write("Invalid token"); 
      return;    
     } 

     response.StatusCode = 200; // OK 

     base.Execute(requestContext); // allow inheriting controller to continue 

    } 
} 

नमूना से विरासत की अपेक्षा न करें एपीआई

public static void ExecutePostRequest(string contentType) 
     { 
      request = (HttpWebRequest)WebRequest.Create(Uri + Querystring); 
      request.Method = "POST"; 
      request.ContentType = contentType; // application/json usually 
      request.Headers["Authorization"] = token; 

      using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
       writer.Write(postRequestData); 

      // GetResponse reaises an exception on http status code 400 
      // We can pull response out of the exception and continue on our way    
      try 
      { 
       response = (HttpWebResponse)request.GetResponse(); 
      } 
      catch (WebException ex) 
      { 
       response = (HttpWebResponse)ex.Response; 
      } 
      finally 
      { 
       using (StreamReader reader = 
        new StreamReader(response.GetResponseStream())) 
        responseText = reader.ReadToEnd(); 
       httpcontext = HttpContext.Current; 
      } 
     } 
+0

पर कॉल करने के लिए कोड जेसन, मुझे कुछ और विवरण पसंद आएंगे। मैं एमवीसी (आरओआर पृष्ठभूमि) के लिए बहुत नया हूं इसलिए मैं इस बात पर अस्पष्ट हूं कि अधिकृत गुण कैसे काम करते हैं। धन्यवाद! –

+0

धन्यवाद जेसन! आप "अनुरोध निकाय में उपयोगकर्ता नाम और पासवर्ड के साथ गुप्त एपीआई कुंजी कैसे पास करते हैं"? क्या आप अनुरोध में कस्टम HTTP शीर्षलेख जोड़ते हैं या आप एचटीपी-प्राधिकरण का उपयोग करते हैं? –

+0

उत्कृष्ट, विस्तृत प्रतिक्रिया के लिए धन्यवाद! –

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