2012-08-28 11 views
10

यह सवाल एक और धागा से संबंधित है, आप here: Forms authentication with SignalR पढ़ सकते हैं जहाँ मैं समझने के लिए रूपों को लागू एएसपी नेट पर फॉर्म्स प्रमाणीकरण और उपयोगकर्ता dfowler का धैर्य के साथ करने की कोशिश की करने के लिए एक सिग्नलआर हबSignalR: कैसे प्रमाणीकरण लागू/समाप्त हब कनेक्शन सर्वर साइड

समस्या का विवरण: मैं चाहता हूं कि केवल प्रमाणित उपयोगकर्ता सिग्नलआर हब को कनेक्ट कर सकें और संदेश प्राप्त/भेज सकें।

घुसपैठ परिदृश्य: घुसपैठिया क्लाइंट कंप्यूटर पर अस्थायी फ़ाइलों तक पहुंचने वाले वेब पेज के HTML और जावास्क्रिप्ट को संभावित रूप से कैप्चर/एक्सेस कर सकता है। इस घुसपैठिए को हब के कनेक्शन को स्थापित/उपयोग करने के लिए आवश्यक सभी विवरण (विधियों, केंद्र नाम आदि) को जान सकते हैं। dfowler से एक प्रस्तावित समाधान implementing IConnect है:

आप IConnected को लागू करने और कनेक्ट में निम्नलिखित कोड लिखने होता अगर (Context.User.Identity.IsAuthenticated!) नया अपवाद ("GTFO") फेंक;

इसलिए मैं इस

public System.Threading.Tasks.Task Connect() 
    { 
     if (!Context.User.Identity.IsAuthenticated 
      || !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2") 
      )) 
      throw new Exception("User not authorized"); 
     return null; 
    } 

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

तथ्यों में, मेरे परीक्षणों से, ग्राहक अभी भी सभी संदेशों को पढ़ सकते हैं (और उन्हें भी भेज सकते हैं)।

अब, जो मेरे मन के लिए आते हैं दृष्टिकोण:

  1. बिल्कुल सही समाधान: अस्वीकार या सर्वर साइड पर कनेक्शन समाप्त: कोई सुराग नहीं कैसे SignalR में यह करने के लिए (मैं में एक विधि को खोजने के लिए करने की कोशिश की API लेकिन कोई किस्मत)
  2. जांच करता है, तो उपयोगकर्ता एक समूह प्राप्त/(उसे संदेश भेजने से बचने के लिए का हिस्सा है लेकिन यह अभी भी बाढ़/डॉस हमलों)
  3. डिस्कनेक्ट करने के लिए ग्राहक के लिए एक संदेश भेजा जा रहा है की संभावना है: स्पष्ट रूप से अगर मैं घुसपैठियों से लड़ रहा हूं तो इससे मदद नहीं मिलती है।

कोई अन्य दृष्टिकोण? सर्वर पक्ष पर कनेक्शन को समाप्त करने का कोई भी तरीका या स्वीकार किया जाना चाहिए कि एकमात्र असली प्रमाणीकरण मेजबान वेबपृष्ठ में से एक है (सभी सिग्नलआर क्लाइंट हमलों के लिए दरवाजा खोलना?

client-server communication when Connect throws exception

यह foreverFrame की तरह दिखता है: सर्वर संचार जब मैं IConnect.Connect विधि बिना शर्त एक अपवाद फेंक (ब्राउज़र IE9) का उपयोग करें -)

संपादित

यहाँ ग्राहक के अनुक्रम है विफल रहता है लेकिन लंबे समय तक चलने वाली फॉलबैक स्थापित की जा रही है और वैसे भी काम करती है - यह ब्लॉक

द्वारा जावास्क्रिप्ट में कैप्चर की गई त्रुटि को फेंकने के बाद
if (connection.state === signalR.connectionState.connecting) { 
      // Connection hasn't been started yet 
      throw "SignalR: Connection has not been fully initialized. 
    Use .start().done() or .start().fail() to run logic after 
    the connection has started."; 
     } 
+0

[फीचर अनुरोध] (https://github.com/SignalR/SignalR/issues/635) सिग्नलर गिटहब प्रोजेक्ट साइट – eddo

उत्तर

5

हमारे पास एक समस्या है जहां हमें कनेक्शन को पूरी तरह से अवरुद्ध करने की अनुमति देने की आवश्यकता है। अभी आपको प्रत्येक विधि की रक्षा करनी होगी। यह सबसे साफ नहीं है लेकिन 1.0 अल्फा 1 के लिए हमारे पास ऐसा करने के लिए कुछ तंत्र होगा।

एक अतिरिक्त समस्या यह है कि यह सभी केंद्रों के लिए एक ही कनेक्शन है ताकि आप किसी विशिष्ट केंद्र के लिए कनेक्शन को अस्वीकार नहीं कर सकें।

संपादित

वास्तव में अगर तुम फेंक यह कनेक्शन समाप्त करता है जहाँ तक मेरी परीक्षण चला जाता है। आप क्या व्यवहार देख रहे हैं?

+0

में बनाया गया अब समझ में आता है - स्पष्ट रूप से चीजें सामान्य रूप से पहले विचार की तुलना में अधिक जटिल होती हैं। हालांकि यह एक बड़ी समस्या है क्योंकि यह सिग्नलआर कॉर्पोरेट अनुप्रयोगों के लिए उपयुक्त नहीं है और सुरक्षा के मामले में एक बड़ा खतरा खुलता है - कृपया इसे कुछ प्राथमिकता दें ... ऑटो-रीकनेक्ट के बारे में, मैंने स्वयं प्रश्न में कुछ विवरण जोड़े हैं - इस तरह के दर्द होने के लिए खेद है, dfowler :) – eddo

+0

मेरा दोहराव - हब को जोड़ने के लिए, क्लाइंट को ' 'प्राप्त करना होगा। क्या एएसपी.NET प्रमाणीकरण के माध्यम से इसका सर्वर पक्ष बनाना संभव नहीं होगा? सुनिश्चित नहीं है कि यह दृष्टिकोण सिग्नलआर क्लाइंट को भी बढ़ाया जा सकता है ... – eddo

+0

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

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