2012-04-03 6 views
26

मैं सिग्नलआर जावास्क्रिप्ट क्लाइंट और एएसपी.NET सर्विसहोस्ट का उपयोग कर रहा हूं। मुझे केवल साइन इन उपयोगकर्ताओं के लिए सुलभ होने के लिए सिग्नलआर हब और कॉलबैक की आवश्यकता है। मुझे HttpContext.Current.User से FormsIdentity का उपयोग करके हब से वर्तमान में लॉग इन किए गए उपयोगकर्ता की पहचान प्राप्त करने में भी सक्षम होना चाहिए।सुरक्षित सिग्नलर कॉल

  1. मैं हब को कैसे सुरक्षित करूं ताकि केवल प्रमाणीकृत उपयोगकर्ता सिग्नलआर का उपयोग कर सकें?
  2. मुझे वर्तमान में लॉग इन उपयोगकर्ता की पहचान कैसे प्राप्त हो सकती है?
+0

सिग्नलर 1.0 और ओविन का उपयोग कर सिग्नलर यूआरएल को लॉक करने का एक और तरीका: http://eworldproblems.mbaynton.com/2012/12/securing-signalr-to-your-sites-users/ – mbaynton

उत्तर

19

आपको हब से उपलब्ध this.Context.User.Identity का उपयोग करना चाहिए। See a related question

संपादित करें: बंद करने के लिए अप्रमाणित उपयोगकर्ताओं:

public void ThisMethodRequiresAuthentication() 
{ 
    if(!this.Context.User.Identity.IsAuthenticated) 
    { 
    // possible send a message back to the client (and show the result to the user) 
    this.Clients.SendUnauthenticatedMessage("You don't have the correct permissions for this action."); 
    return; 
    } 

    // user is authenticated continue 
} 

संपादित करें # 2: यह बेहतर हो सकता है, बस एक संदेश

public string ThisMethodRequiresAuthentication() 
    { 
     if(!this.Context.User.Identity.IsAuthenticated) 
     { 
     // possible send a message back to the client (and show the result to the user) 
     return "You don't have the correct permissions for this action."); 

     // EDIT: or throw the 403 exception (like in the answer from Jared Kells (+1 from me for his answer), which I actually like better than the string) 
     throw new HttpException(403, "Forbidden"); 
     } 

     // user is authenticated continue 

     return "success"; 
    } 
+1

ग्रेट, अब कोई विचार है कि कैसे सुरक्षित हब्स ताकि अनधिकृत उपयोगकर्ता कनेक्ट नहीं हो सकें? – reach4thelasers

+0

@ access4thelasers कृपया मेरा संपादन देखें। यही मैं कोशिश करता हूँ। – Aligned

+0

नीचे @ जेरेड काल्स के उत्तर को देखने के बाद, मैं अनुशंसा करता हूं कि यदि आपको अपने दृष्टिकोण का उपयोग करने के लिए अपने सभी तरीकों पर प्रमाणीकरण को मजबूर करने की आवश्यकता है, लेकिन यदि आपको केवल कुछ तरीकों से इसकी आवश्यकता है, तो मेरा उपयोग करें। – Aligned

14

आप लॉक कर सकते हैं SignalR यूआरएल का उपयोग कर PostAuthenticateRequest वापसी आपके एचटीपी अनुप्रयोग पर घटना। अपने Global.asax.cs में निम्नलिखित जोड़ें

यह उन अनुरोधों को अवरुद्ध करेगा जो "https" का उपयोग नहीं करते हैं या प्रमाणित नहीं हैं।

public override void Init() 
{ 
    PostAuthenticateRequest += OnPostAuthenticateRequest; 
} 

private void OnPostAuthenticateRequest(object sender, EventArgs eventArgs) 
{ 
    if (Context.Request.Path.StartsWith("/signalr", StringComparison.OrdinalIgnoreCase))    
    { 
     if(Context.Request.Url.Scheme != "https") 
     { 
      throw new HttpException(403, "Forbidden"); 
     } 

     if (!Context.User.Identity.IsAuthenticated) 
     { 
      throw new HttpException(403, "Forbidden"); 
     } 
    }    
} 

अपने केंद्र के अंदर आप वर्तमान उपयोगकर्ता को संदर्भ ऑब्जेक्ट के माध्यम से एक्सेस कर सकते हैं।

Context.User.Identity.Name 
4

अपने प्रश्न का हिस्सा 1. लिए आप नीचे दिए जैसे एनोटेशन इस्तेमाल कर सकते हैं (यह SignalR 1.1 के साथ काम किया):

[Authorize] 
public class MyHub : Hub 
{ 
    public void MarkFilled(int id) 
    { 
     Clients.All.Filled(id); 
    } 
    public void MarkUnFilled(int id) 
    { 
     Clients.All.UnFilled(id); 
    } 
} 
0

कुछ अन्य उत्तर से लापता उपयोग करने के लिए SignalR के कस्टम में बनाया क्षमता है ऑथ कक्षाएं विषय पर वास्तविक सिग्नलआर दस्तावेज भयानक है, लेकिन मैंने पेज के निचले हिस्से में एक टिप्पणी छोड़ दी है कि वास्तव में इसे कैसे करें (Authentication and Authorization for SignalR Hubs)।

मूल रूप से आपके द्वारा दी गई SignalR AuthorizeAttribute वर्ग

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class CustomAuthAttribute : AuthorizeAttribute 

तो फिर तुम वर्ग घोषणा से ऊपर [CustomAuth] के साथ अपने केन्द्रों को सजाने ओवरराइड।

bool AuthorizeHubConnection(HubDescriptor hubDesc, IRequest request); 
bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubContext, bool appliesToMethod); 

जब से मैं आईआईएस सर्वर पर कर रहा हूँ और एक कस्टम प्रमाणन योजना है, मैं बस सच AuthorizeHubConnection विधि से लौटने के लिए, क्योंकि मेरे प्रमाणीकरण HttpModule मैं पहले से ही authenicate: फिर आप को संभालने के लिए प्रमाणन के लिए निम्न विधियों ओवरराइड कर सकते हैं/सिग्नल/कनेक्ट और/सिग्नल/कॉल को दोबारा कनेक्ट करें और एचटीपी कॉनटेक्स्ट आइटम में उपयोगकर्ता डेटा को सेव करें। तो मॉड्यूल प्रारंभिक सिग्नलर कनेक्शन कॉल (एक मानक HTTP कॉल जो वेब सॉकेट कनेक्शन शुरू करता है) पर प्रमाणीकरण संभालता है।

विशिष्ट हब विधियों पर कॉल अधिकृत करने के लिए मैं HttpContext में सहेजी गई अनुमतियों के विरुद्ध विधि नामों की जांच करता हूं (यह वही HttpContext प्रारंभिक कनेक्ट अनुरोध से सहेजा गया है) और उपयोगकर्ता को निश्चित कॉल करने की अनुमति है या नहीं तरीका।

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