2013-01-04 17 views
5

मैंने Asp.Net के शीर्ष पर एक सर्विसस्टैक सेवा बनाई है जो मूल प्रमाणीकरण लागू करता है। सब कुछ सेवा मार्गों पर ठीक काम कर रहा है। मैं लॉगिन करने में सक्षम हूं और मुझे सत्र कुकीज़ मिलती है जो बाद की कॉल पर मान्य होती हैं। मैं उन अनुरोधों के लिए एक HttpClient का उपयोग कर रहा हूँ।सर्विसस्टैक प्रमाणीकरण प्लगइन का उपयोग कर सिग्नलआर हब प्रमाणीकरण

मेरे पास एक सिग्नलआर हब भी है जो एक ही Asp.Net सेवा पर चलता है, लेकिन प्रिंसिपल को मेरे हब विधियों पर प्रमाणित नहीं किया जाता है।

मूल रूप से मुझे जो चाहिए वह सर्विसस्टैक के लिए मेरे हब में कॉल को अवरुद्ध करने और सत्र कुकी को सत्यापित करने और Context.User.Identity को पॉप्युलेट करने और इसे प्रमाणीकृत के रूप में चिह्नित करने के लिए है। अगर मैं इसे स्थापित कर सकता हूं, तो मेरे केंद्र पर एक सरल [अधिकृत] विशेषता शेष करेगी। ,

// set up a HttpClient with a cookie container to hold the session cookie 
var cookieJar = new CookieContainer(); 
var handler = new HttpClientHandler { CookieContainer = cookieJar, UseCookies = true, UseDefaultCredentials = false }; 

var client = new HttpClient(handler) { BaseAddress = _baseUri }; 

client.DefaultRequestHeaders.Authorization = 
new AuthenticationHeaderValue("Basic", 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", userName, password)))); 

// do client login and get response with session cookie... 
var response = client.PostAsync(...); 

// add the cookies to the SignalR hub connection 
var responseCookies = cookieJar.GetCookies(_baseUri); 
var cookieContainer = new CookieContainer(); 
foreach (Cookie cookie in responseCookies) 
{ 
    cookieContainer.Add(cookie); 
} 
_hubConnection = new HubConnection(_baseUri.ToString()) { CookieContainer = cookieContainer }; 

इस सेटअप के बाद मेरी सत्र कुकीज़ प्रत्येक मंगलाचरण पर हब के लिए भेजा जाता:

यहाँ मेरी कोड का एक नमूना है। किसी भी तरह से मुझे उन अनुरोधों को रोकने और प्रमाणीकृत उपयोगकर्ता सेट करने के लिए सर्विसस्टैक की आवश्यकता है।

उत्तर

6

सेवास्टैक को स्वाभाविकता दें और उपयोगकर्ता सत्र को जारी रखें। तब SignalR हब अंतिमबिंदुओं प्रमाणीकरण की जरूरत है कि इस कोड डाल:

var cache = AppHostBase.Resolve<ICacheClient>(); 
var sess = cache.SessionAs<AuthUserSession>(); 
if (!sess.IsAuthenticated) 
    throw new AuthenticationException(); 
+0

जो मूल रूप से पोस्ट किए गए कोड के साथ संयोजन में काम करता था जहां मैंने साइनल कुकी कुकी कंटेनर में ऑथ कुकीज़ सहेजी थी। धन्यवाद! – Kevin

2

जोहान का जवाब काम करता है, लेकिन यह हर विधि के लिए इस कोड डाल करने के लिए और यदि आप इसे हब निर्माता में डाल दिया, उस में असफल हो जायेगी बहुत सुविधाजनक नहीं है पृष्ठ पर वेब "सिंगलटन के माध्यम से सुलभ केवल एएसपी.NET अनुरोधों को समर्थित" अपवाद के साथ रीफ्रेश किया गया है।

इसके बजाय, मैंने एक कस्टम विशेषता बनाने के लिए चुना है जो आपको हब और विधि कॉल प्राधिकरण पर अधिक नियंत्रण देता है।

सरल विशेषता इस प्रकार दिखाई देगा:

[AttributeUsage(AttributeTargets.Class, Inherited = false)] 
public class AuthorizeServiceStack : AuthorizeAttribute 
{ 
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     return CheckAuthorization(); 
    } 

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     return CheckAuthorization(); 
    } 

    private static bool CheckAuthorization() 
    { 
     var cache = AppHostBase.Resolve<ICacheClient>(); 
     var sess = cache.SessionAs<AuthUserSession>(); 
     return sess.IsAuthenticated; 
    } 

} 

आप देख सकते हैं, कोड जोहन के जवाब में रूप में ही है, लेकिन यह वेब के साथ-साथ काम करेंगे, यह सुनिश्चित करना कि HttpContext.Current रिक्त नहीं है जब आप कैश को कॉल कर रहे हैं। सत्र

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