2010-05-18 21 views
6

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

इस उदाहरण लें:

मैं पेज /route.aspx?routeid=854 जो मेरा है पर मेरे मार्ग को संपादित करने के लिए जा रहा हूँ (उपयोगकर्ता के आईडी: 1)।

लेकिन क्योंकि मैं एक जिज्ञासु पुरुष मैं /route.aspx?routeid=855 जो किसी अन्य उपयोगकर्ता के अंतर्गत आता है तक पहुँचने का प्रयास (उपयोगकर्ता के आईडी: 2)।

मैं लोगों से अन्य लोगों के डेटा तक पहुंचने से कैसे बच सकता हूं? क्या मुझे प्रत्येक उपयोगकर्ता आईडी (सत्र से) प्रत्येक डेटाबेस-कॉल के साथ भेजना चाहिए, क्या मुझे प्रत्येक पृष्ठ लोड पर उपयोगकर्ता/पासवर्ड मान्य करना चाहिए या सबसे अच्छा और सबसे सुरक्षित तरीका क्या है?

मुझे उम्मीद है कि मैंने यह स्पष्ट कर दिया है।

उत्तर

3

:

select * from route where [email protected] and [email protected] 

आप Linq की तरह कुछ प्रयोग कर रहे हैं तो आप इस तरह एक पुन: प्रयोज्य समारोह के साथ की तरह उपयोगकर्ता प्रतिबंध लगाने से एक बेहतर सुरक्षा मॉडल बना सकते हैं पहिया

एक नए अंदाज़ में नहीं है संपादित करें: भंडारण UserId - आप की जरूरत नहीं है। आप जब तक उपयोगकर्ता निश्चित रूप से प्रवेश करने को किसी भी समय MembershipProvider से प्राप्त कर सकते हैं:

MembershipUser user = Membership.GetUser(); 
Guid UserID = user.ProviderUserKey; 

मेरे लिए लगता है कि आपने ASP.NET सदस्यता प्रदाता को लागू करने की जरूरत है। http://odetocode.com/articles/427.aspx

इसके अलावा, स्कॉट गुथरी से एक अच्छी श्रृंखला: मान्य करने के लिए है जो एक उपयोगकर्ता के उपयोग रूपों प्रमाणीकरण: http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx

सामान्य तौर पर, यह तरीका अपनाते हैं इस संसाधन का एक पढ़ा है। यह सुरक्षा का प्रमाणीकरण पक्ष है। यही है, उपयोगकर्ता को निर्धारित करना वह है जो वे कहते हैं कि वे आमतौर पर उपयोगकर्ता नाम और पासवर्ड के साथ होते हैं।

सुरक्षा का दूसरा भाग प्राधिकरण है, जो तब होता है जब आप जानते हैं कि उपयोगकर्ता कौन है। यह मूल रूप से निर्धारित करता है कि एक प्रमाणीकृत उपयोगकर्ता के पास कौन से संसाधन हैं। एक परिपक्व प्रणाली निम्नलिखित संस्थाओं में शामिल होंगे: 854 (एक संसाधन) routeid के लिए एक उपयोगकर्ता एक्सेस देने के लिए उपयोगकर्ता के लिए सीधे संसाधन प्रदान करने या कर सकता है, इस प्रकार

User: may contain extended profile information captured on registration 
Resource: a page or other resource that can be restricted. 
Group: a group of users who can access resources due to their group membership (groups are granted resource access) 
Role: a type of user such as Administrator/Developer/Salesperson. 

यदि एक से अधिक उपयोगकर्ताओं को, जो करने के लिए acceses होना चाहिए देखते हैं वह संसाधन और वे उपयोगकर्ता प्राकृतिक समूह बनाते हैं, फिर उस समूह को बनाते हैं, समूह को संसाधन प्रदान करते हैं और उपयोगकर्ता को समूह में जोड़ते हैं।

तो फिर तुम एक संसाधन आईडी द्वारा User.Resources उपयोग कर सकते हैं या आप

if(!User.IsInRole("RoleName")) 
{ 
    //redirect to access denied page 
} 

का उपयोग कर एक पूरे पृष्ठ की रक्षा कर सकते उपलब्ध अच्छी बातें की बहुत सारी प्रदाता मॉडल का उपयोग कर रहे हैं।

संपादित करें: अगर आप अपने उपयोगकर्ताओं के बारे में प्रोफ़ाइल जानकारी संग्रहीत करने का निर्णय लेते हैं तो कुछ पता होना चाहिए: प्रोफ़ाइलप्रोवाइडर का डिफ़ॉल्ट कार्यान्वयन विशेष रूप से अच्छा नहीं है। स्कॉट गुथरी ने एक टेबल आधारित प्रदाता पर एक अच्छा लेख लिखा जो बेहतर है: http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx

+0

मैं लॉगिन करने के लिए एएसपी.NET सदस्यशिप प्रदाता का उपयोग कर रहा हूं। लेकिन कस्टम सूचनाओं पर कुछ जानकारी देखने के लिए अच्छा लगा। :-) उसमें से अधिक पढ़ने के लिए जा रहे हैं .. – janhartmann

+0

अच्छी चीजें: यहां कुछ अच्छा उदाहरण कोड भी है: http://asp.dotnetheaven.com/aspnet/doc/security/membership.aspx#auth –

+0

उपयोगकर्ता आईडी संग्रहीत करने के संबंध में , मेरे उत्तर के शीर्ष पर संपादित करें देखें। –

3

आपका सबसे अच्छा तरीका routeId साथ डेटाबेस के लिए userId भेजने के लिए उपयोगकर्ता पहुँच सकते हैं, तो देखने के लिए होगा।

कुछ की तरह:

public Route Get(int routeId, int userId) 
{ 
    var query repository.Get<Route>().Where(r => r.Id == routeId); 
    query = applySecurityModel(query, userId); 
    return query.FirstOrDefault(); 
} 

private IQueryable<T> applySecurityModel<T>(IQueryable<T> query, int userId) where T : ISecurable 
{ 
    return query.Where(t => t.UserId == userId); 
} 

public interface ISecurable 
{ 
    int UserId { get; set; } 
} 

public class Route 
{ 
    int Id { get; set; } 
    int UserId { get; set; } 
} 
+0

इस उपयोगकर्ता आईडी को स्टोर करने का सबसे अच्छा तरीका कहां है? सत्र? – janhartmann

+0

और क्या मुझे वर्तमान उपयोगकर्ता को सत्यापित करना चाहिए कि इस उपयोगकर्ता आईडी से पेज लोड पर मेल खाता है? – janhartmann

+1

उपयोगकर्ता आईडी सर्वर पक्ष (उदा। सत्र ऑब्जेक्ट में) सहेजें और ग्राहक पक्ष नहीं (उदाहरण के लिए कुकी में)। – Aurril

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