मैं कर रहा हूँ मेरे वेब ऐप में समान समस्याएं हैं, इसलिए मैं एक साधारण कुकी प्रमाणीकरण प्रणाली का उपयोग करता हूं जो जांच के लिए एओपी शैली दृष्टिकोण का उपयोग करता है किसी विशेषता वाले किसी भी नियंत्रक, फिर वर्तमान संदर्भ प्राप्त करेंगे (यह स्थिर 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
}
}
यह सही नहीं है लेकिन काम करेगा (मुझे लगता है), मुझे भी यकीन है कि मैंने एक बार कहीं पढ़ा है कि हब्स प्रत्येक अनुरोध के लिए नए तत्काल हैं, और यदि यह वास्तव में सच है, तो संभवतः आप इस तर्क को अपने कन्स्ट्रक्टर में डाल सकते हैं यदि आप चाहें हब के भीतर हर कार्रवाई के लिए प्रमाणीकरण लागू करने के लिए।
आशा है कि मदद करता है, या आपको विचार देता है ... यह जानने में रुचि होगी कि आपने अंत में इसे कैसे हल किया है।
मैंने क्वेरी स्ट्रिंग (यानी $ .connection.hub.qs) के माध्यम से प्रत्येक सिग्नल अनुरोध के साथ जेनरेट किए गए उपयोगकर्ता टोकन को पास करके टोकन आधारित सुरक्षा लागू की है। क्लाइंट उस कुंजी को देता है जो उपयोगकर्ता को क्रॉस-रेफ करता है, और सर्वर पर मैं टोकन उठाता हूं और फिर क्रॉस रेफरी से उपयोगकर्ता को लोड करता हूं। यह काम करता है, लेकिन यह बहुत बदसूरत है, साथ ही मैं यह नहीं समझ सकता कि त्रुटि पर फेंकने वाले ValidateToken() विधि को कॉल करने के लिए सुरक्षा को कैसे सुरक्षित रूप से लागू किया जाए। –
इस पर कोई अद्यतन? क्या आपको अभी तक ऐसा करने का बेहतर तरीका मिला है? मुझे एक ही स्थिति का सामना करना पड़ रहा है। – BowserKingKoopa