2013-04-05 5 views
6

से प्राप्त एक स्वयं होस्ट किए गए सिग्नलआर सर्वर में प्राधिकरण कार्यान्वित करना मैं स्वयं-होस्टेड (गैर-आईआईएस) वातावरण में चल रहे बैक एंड सेवा पर सिग्नलआर के लिए प्राधिकरण सुरक्षा को कार्यान्वित करने के तरीके पर कुछ मार्गदर्शन ढूंढ रहा हूं, जिसे कॉल किया जाता है एक वेब अनुप्रयोग से। बैकएंड ऐप मूल रूप से एक मॉनिटर है जो सिग्नलआर घटनाओं को HTML आधारित क्लाइंट पर वापस चलाता है। यह सब ठीक काम करता है (वास्तव में वास्तव में अच्छी तरह से)।वेब

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

क्या कोई इस तरह के लेख अग्रेषण को पूरा करने के तरीके पर कुछ रणनीतियों या पैटर्न को इंगित कर सकता है?

+0

मैंने क्वेरी स्ट्रिंग (यानी $ .connection.hub.qs) के माध्यम से प्रत्येक सिग्नल अनुरोध के साथ जेनरेट किए गए उपयोगकर्ता टोकन को पास करके टोकन आधारित सुरक्षा लागू की है। क्लाइंट उस कुंजी को देता है जो उपयोगकर्ता को क्रॉस-रेफ करता है, और सर्वर पर मैं टोकन उठाता हूं और फिर क्रॉस रेफरी से उपयोगकर्ता को लोड करता हूं। यह काम करता है, लेकिन यह बहुत बदसूरत है, साथ ही मैं यह नहीं समझ सकता कि त्रुटि पर फेंकने वाले ValidateToken() विधि को कॉल करने के लिए सुरक्षा को कैसे सुरक्षित रूप से लागू किया जाए। –

+0

इस पर कोई अद्यतन? क्या आपको अभी तक ऐसा करने का बेहतर तरीका मिला है? मुझे एक ही स्थिति का सामना करना पड़ रहा है। – BowserKingKoopa

उत्तर

2

सिग्नलर प्रमाणीकरण के लिए कोई अतिरिक्त सुविधाएं प्रदान नहीं करता है। इसके बजाय, यह आपके आवेदन की प्रमाणीकरण तंत्र के साथ काम करने के लिए डिज़ाइन किया गया है।

केन्द्रों

आप सामान्य रूप से प्रमाणीकरण करना चाहिए और उसके बाद केन्द्रों पर प्रमाणीकरण के परिणामों को लागू करने के SignalR द्वारा प्रदान की अधिकृत विशेषता का उपयोग।

अधिकृत विशेषता हब में एक संपूर्ण हब या विशेष तरीकों पर लागू की जा सकती है। कुछ उदाहरण:

  • [अधिकृत] - केवल प्रमाणीकृत उपयोगकर्ताओं
  • [अधिकृत (भूमिकाओं = "व्यवस्थापक, प्रबंधक")] - केवल प्रमाणीकृत निर्दिष्ट नेट भूमिकाओं में उन
  • [अधिकृत (उपयोगकर्ता = " user1, user2 ")] - निर्दिष्ट उपयोगकर्ता नाम

तुम भी आवश्यकता होती है सभी केन्द्रों प्रमाणीकरण Application_Start विधि में निम्न विधि जोड़कर की आवश्यकता के लिए कर सकते हैं साथ ही प्रमाणीकृत उपयोगकर्ताओं:

GlobalHost.HubPipeline.Require प्रमाणीकरण();

लगातार कनेक्शन

आप अनुरोध की उपयोगकर्ता वस्तु का उपयोग कर सकते देखने के लिए कि उपयोगकर्ता को प्रमाणीकृत किया जाता है:

request.User.IsAuthenticated

+2

मैं इस सिग्नल सेवा की मेजबानी के लिए एएसपी.NET का उपयोग नहीं कर रहा हूं, इसलिए मुझे नहीं लगता कि यह काम करता है क्योंकि कोई एएसपी.NET सुरक्षा या जांच करने की पहचान नहीं है। मुझे लगता है कि सिग्नलआर अंतर्निहित प्रमाणीकरण प्रदान नहीं करता है, जो ठीक है। मैं ऐप्स पर सुरक्षा संदर्भ को कैसे पारित करने के बारे में विचारों के बारे में पूछ रहा हूं और फिर प्रत्येक हब विधि में सुरक्षा को सत्यापित करने के लिए मिर्च कॉल किए बिना प्रमाणीकरण को सामान्य रूप से कैसे संभालना है। –

2

मैं कर रहा हूँ मेरे वेब ऐप में समान समस्याएं हैं, इसलिए मैं एक साधारण कुकी प्रमाणीकरण प्रणाली का उपयोग करता हूं जो जांच के लिए एओपी शैली दृष्टिकोण का उपयोग करता है किसी विशेषता वाले किसी भी नियंत्रक, फिर वर्तमान संदर्भ प्राप्त करेंगे (यह स्थिर HttpContext.Current या इंटरसेप्टर के प्रकार के आधार पर लक्ष्य आमंत्रण ऑब्जेक्ट से हो) और फिर कुकी मौजूद है सत्यापित करें, इसमें सही डेटा है, फिर अंत में सत्यापित करें डीबी या कैश आदि के साथ टोकन

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

मैं Ninject और अवरोधन विस्तार है, लेकिन का उपयोग सबसे प्रमुख डि चौखटे इन दिनों इस तरह के Autofac, विंडसर, स्प्रिंग आदि के रूप में आईओसी प्लगइन/एक्सटेंशन, के कुछ फार्म है

यदि आप खुश नहीं थे नीचे मार्ग से जा रहा अपने वर्तमान प्रोजेक्ट में DI और/या AOP को पेश करने के बाद, हो सकता है कि आप केवल एक कस्टम हब इंस्टेंस बना सकें जिसमें आपका प्रमाणीकरण तर्क शामिल हो और फिर बस अपने हब्स में इसका उपयोग करें, तो ठीक है कि आप अभी भी प्रत्येक प्रमाणीकरण तर्क को मैन्युअल रूप से कॉल करेंगे हब विधि जिसे आप संरक्षित करना चाहते हैं, लेकिन इसका कम कोड, इसलिए कुछ:

public class AuthorisableHub : Hub 
{ 
    private ISomeAuthenticationToken GetSomeAuthenticationTokenFromRequest(Request request) // probably a SignalR specific request object 
    { 
     // Get your token from the querystring or cookie etc 
    } 

    private bool IsAuthenticationTokenValid(ISomeAuthenticationToken token) 
    { 
     // Perform some validation, be it simple or db based and return result 
    } 

    protected void PerformUserAuthentication() 
    { 
     var token = GetSomeAuthenticationTokenFromRequest(Context.Request); 
     var isRequestValid = IsAuthenticationTokenValid(token); 

     if(!isRequestValid) 
     { throw new HttpException(403, "<Some forbidden message here>"); } 
    } 
} 

public class MyFancyPantsHub : AuthorisableHub 
{ 
    public void TellAllClientsSomethingSecret(ISecret secret) 
    { 
     PerformUserAuthentication(); 

     // Do stuff with the secret as it should have bombed the user out 
     // before it reaches here if working correctly 
    } 
} 

यह सही नहीं है लेकिन काम करेगा (मुझे लगता है), मुझे भी यकीन है कि मैंने एक बार कहीं पढ़ा है कि हब्स प्रत्येक अनुरोध के लिए नए तत्काल हैं, और यदि यह वास्तव में सच है, तो संभवतः आप इस तर्क को अपने कन्स्ट्रक्टर में डाल सकते हैं यदि आप चाहें हब के भीतर हर कार्रवाई के लिए प्रमाणीकरण लागू करने के लिए।

आशा है कि मदद करता है, या आपको विचार देता है ... यह जानने में रुचि होगी कि आपने अंत में इसे कैसे हल किया है।

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