2015-06-13 10 views
8

से मेरे पास एएसपीनेट वेब एपीआई नहीं है।संसाधन पुनर्प्राप्ति से वेब एपीआई को कैसे सुरक्षित करें संसाधन मालिक

मैं अपने वेब एपीआई को बाद में एक एज़ूर वेबसाइट पर स्वयंहोस्ट करना चाहता हूं।

एक उपयोगकर्ता में लॉग इन ब्राउज़र /api/bankaccounts/3

में ऐसा सब विवरण के बारे में bank account number 3 प्राप्त करने के लिए कर सकता है।

लेकिन लॉग इन उपयोगकर्ता bank account number 3 का मालिक नहीं है।

मैं कैसे पीछे कि लॉग इन

उपयोगकर्ता में

केवल पुनः प्राप्त/अपने ही संसाधनों डेटाबेस में संशोधित कर सकते हैं मेरी नियंत्रकों और सेवाओं डिजाइन करने के लिए है?

अद्यतन

बाद मैं बनाया एक:

public class UserActionsAuthorizationFilter : AuthorizationFilterAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext != null) 
     { 
      bool canUserExecuteAction = IsResourceOwner(actionContext); 
      // stop propagation 
     } 
    } 

private bool IsResourceOwner(HttpActionContext actionContext) 
     { 
      var principal = (ClaimsPrincipal)Thread.CurrentPrincipal; 
      var userIdAuthenticated = Convert.ToInt32(principal.Claims.Single(c => c.Type == ClaimTypes.Sid).Value); 

      int targetId = Convert.ToInt32(actionContext.Request.GetRouteData().Values["Id"]); 
      var requstScope = actionContext.ControllerContext.Request.GetDependencyScope(); 
      var service = (ISchoolyearService)requstScope.GetService(typeof(ISchoolyearService)); 
      bool canUserExecuteAction = service.HasUserPermission(userIdAuthenticated, targetId); 
      return canUserExecuteAction; 
     } 
} 

सवाल अब यह है कि IsResouceOwner एक निश्चित सेवा के लिए hardcoded है => SchoolyearService इस प्रकार अकादमिक एसक्यूएल तालिका

मैं जरूरत के लिए बाध्य है IsResourceOwner विधि को सामान्य रूप से फ़ील्ड UserId/UserEmail वाले सभी SQL तालिकाओं के लिए काम करने के लिए।

समस्या यह है- और मुझे सच में लगता है कि कोई भी इस तरह से ऐसा नहीं कर रहा है- मुझे प्रत्येक संसाधन मालिक को हैसयूसरप्रमिशन विधि में सही एसक्यूएल तालिका में चेक करना होगा।

यह मानचित्रण कैसा दिखना चाहिए?

नियंत्रक का नाम "SchoolyearController" जांचने के लिए इस प्रकार तालिका "स्कूलीयर" तालिका है? क्या बकवास है।

यह कस्टम विशेषता "UserActionsAuthorizationFilter" प्रत्येक "डेटा" नियंत्रक पर होगी।

जो भी नियंत्रक यूआरएल डेटा लाने के लिए ट्रिगर्स करता है, इससे पहले कि मुझे गीलेर की जांच करनी पड़े, वह संसाधन मालिक है।

मुझे लगता है कि मैं इसे फ़िल्टर के अंदर तय नहीं कर सकता।

मुझे डेटा पुनर्प्राप्ति/संशोधन को नियंत्रक के माध्यम से जाने देना है और डेटा पुनर्प्राप्ति के ठीक पहले एक रिपोजिटरी में संसाधन संसाधनकर्ता के अंदर जांच करना है।

आप इस बारे में क्या सोचते हैं:

एपीआई

public async Task<IHttpActionResult> Delete(int id) 
{ 
    var result = await service.Delete(id, User.Identity.UserId); 
    if (result == 0) 
     return NotFound(); 
    return Ok(); 
} 

रेपो

public async Task<int> Delete(int id, int userId) 
    { 
     var schoolyerToDelete = await context.Schoolyears.SingleOrDefaultAsync(s => s.Id == id && s.UserId == userId); 

// If schoolyearToDelete is null nothing is removed, thus the affected rows are ZERO. 
     context.Schoolyears.Remove(schoolyerToDelete); 
     return await context.SaveChangesAsync(); 
    } 
  • विधि जाओ कुछ भी नहीं के लिए गलत प्रयोक्ता-आईडी के लिए दिया जाता है
  • विधि बनाने के लिए: कोई समस्या नहीं, लॉग इन होने पर सभी को संसाधन बनाने में सक्षम होना चाहिए।
  • अद्यतन विधि के लिए: हटाए गए विधि के समान विद्यालय को आईडी और उपयोगकर्ता आईडी द्वारा पुनर्प्राप्त किया जाता है।

आम तौर पर मेरे रिपोजिटरी में हर विधि को सीआरयूडी कार्रवाई में उपयोगकर्ता आईडी पर विचार करना चाहिए।

आपको क्या लगता है?

+0

क्यों एक -1 डाउनवोट? इसके बजाय एक टिप्पणी लिखने की हिम्मत? – Elisabeth

+1

यह सवाल मुझे परेशान करता है। यहां लोक - पूरी तरह से सुरक्षा विशेषज्ञ नहीं हैं। चूंकि आप अपने प्रश्न में बैंक खातों का उल्लेख करते हैं, इसलिए मुझे लगता है कि यह अत्यधिक गोपनीय जानकारी तक पहुंचा जा रहा है। इस प्रकार, आपको वास्तव में यहां क्या कर रहे हैं और यह सुनिश्चित करने के लिए कि यह सुरक्षित तरीके से कैसे चल रहा है, इसकी उचित समझ होनी चाहिए। एसओ पर प्रश्न पूछने से यह प्राप्त करने का सबसे अच्छा तरीका नहीं लगता है। –

+0

@ डेविड आपकी व्याख्या गलत है। बैंक खाता सिर्फ एक नमूना है। – Elisabeth

उत्तर

0

नीचे दिए गए लिंक देखें - यह शामिल किया गया है दोनों प्रमाणीकरण (ताकि आप जानते हैं कि अनुरोध कर रहा है) और प्राधिकरण (ताकि आप जानते हैं कि वे डेटा देखने के लिए अधिकृत कर रहे हैं):

http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

कुछ अन्य जोड़ने के लिए विस्तार - उपयोगकर्ताओं के प्रमाणीकरण को परिभाषित करने वाले आपके डेटाबेस में कॉलम और/या टेबल होना बहुत आम होगा। यह भी संभव है (आपके प्रमाणीकरण तंत्र के आधार पर), प्रमाणीकरण प्रदाता "दावे" या अन्य जानकारी प्रदान कर सकता है जो परिभाषित करता है कि उपयोगकर्ता किस तक पहुंचने के लिए अधिकृत है। हालांकि, यह संभावित रूप से कम सुरक्षित हो सकता है क्योंकि आपको वास्तव में इस जानकारी के स्रोत पर भरोसा करने की आवश्यकता होगी और यह सुनिश्चित करने का एक तरीका है कि यह आपके एपीआई में जमा होने से पहले छेड़छाड़ नहीं किया गया था।

+0

यह बहुत आम और अस्पष्ट उत्तर है। मैंने कोड प्रश्न नमूने के साथ अपना प्रश्न अपडेट किया है। कृपया इस अद्यतन प्रश्न का उत्तर दें। – Elisabeth

+0

उत्तर में एक लिंक शामिल है जो आपको बताता है कि वेब एपीआई में प्रमाणीकरण और प्रमाणीकरण को कैसे कार्यान्वित किया जाए। इसके बारे में कुछ भी अस्पष्ट नहीं है। समझने का एक महत्वपूर्ण बिंदु यह है कि आप अपने नियंत्रक को बदलना नहीं चाहते हैं, आप एक प्राधिकरण फ़िल्टर को कार्यान्वित करना चाहते हैं। यह फ़िल्टर आपके नियंत्रक की तुलना में पहले पाइपलाइन में उपयोगकर्ता प्राधिकरणों की जांच करेगा। आपके नियंत्रक में सामान्य नियंत्रण कार्यक्षमता होनी चाहिए और आपका प्राधिकरण तर्क अलग होना चाहिए। ऑनलाइन 100 उदाहरण हैं (जिसमें मैंने प्रदान किया है)। –

+0

एक और बिंदु मुझे लगता है कि आप गायब हैं। प्रमाणीकरण फ़िल्टर व्यक्तिगत नियंत्रक विधियों, संपूर्ण नियंत्रकों या आपकी पूरी सेवा, आवश्यकतानुसार लागू किया जा सकता है। यदि आपके पास एक विधि पर करने के लिए विशेष प्रमाणीकरण जांच है, तो उसके लिए केवल एक फ़िल्टर हो सकता है। –

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