से मेरे पास एएसपीनेट वेब एपीआई नहीं है।संसाधन पुनर्प्राप्ति से वेब एपीआई को कैसे सुरक्षित करें संसाधन मालिक
मैं अपने वेब एपीआई को बाद में एक एज़ूर वेबसाइट पर स्वयंहोस्ट करना चाहता हूं।
एक उपयोगकर्ता में लॉग इन ब्राउज़र /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();
}
- विधि जाओ कुछ भी नहीं के लिए गलत प्रयोक्ता-आईडी के लिए दिया जाता है
- विधि बनाने के लिए: कोई समस्या नहीं, लॉग इन होने पर सभी को संसाधन बनाने में सक्षम होना चाहिए।
- अद्यतन विधि के लिए: हटाए गए विधि के समान विद्यालय को आईडी और उपयोगकर्ता आईडी द्वारा पुनर्प्राप्त किया जाता है।
आम तौर पर मेरे रिपोजिटरी में हर विधि को सीआरयूडी कार्रवाई में उपयोगकर्ता आईडी पर विचार करना चाहिए।
आपको क्या लगता है?
क्यों एक -1 डाउनवोट? इसके बजाय एक टिप्पणी लिखने की हिम्मत? – Elisabeth
यह सवाल मुझे परेशान करता है। यहां लोक - पूरी तरह से सुरक्षा विशेषज्ञ नहीं हैं। चूंकि आप अपने प्रश्न में बैंक खातों का उल्लेख करते हैं, इसलिए मुझे लगता है कि यह अत्यधिक गोपनीय जानकारी तक पहुंचा जा रहा है। इस प्रकार, आपको वास्तव में यहां क्या कर रहे हैं और यह सुनिश्चित करने के लिए कि यह सुरक्षित तरीके से कैसे चल रहा है, इसकी उचित समझ होनी चाहिए। एसओ पर प्रश्न पूछने से यह प्राप्त करने का सबसे अच्छा तरीका नहीं लगता है। –
@ डेविड आपकी व्याख्या गलत है। बैंक खाता सिर्फ एक नमूना है। – Elisabeth