6

मैं अपने वेब एपीआई में नियंत्रक के बाहर संदर्भ से वर्तमान उपयोगकर्ता को प्राप्त करने का प्रयास कर रहा हूं। मैं उपयोगकर्ताओं को प्रमाणीकृत करने के लिए OpenIddict का उपयोग कर रहा हूं, इसलिए प्रमाणीकरण टोकन द्वारा किया गया है।वेब एपीआई में नियंत्रक के बाहर वर्तमान उपयोगकर्ता कैसे प्राप्त करें .NET Core

मैं पंजीकृत किया है HttpContextAcessor मेरी Startup.cs में एक सिंगलटन के रूप में:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

उसके बाद, मैं अपने हब में HttpContexrAcessor इंजेक्षन, इस तरह:

public class NotificationHub : Hub 
    { 
     private IHttpContextAccessor _contextAccessor; 
     private HttpContext _context { get { return _contextAccessor.HttpContext; } } 

     public NotificationHub(IHttpContextAccessor contextAccessor) 
     { 
      _contextAccessor = contextAccessor; 
     } 

     public async Task JoinGroup() 
     { 
      Groups.Add(Context.ConnectionId, $"notification_{_context.User.Identity.Name}"); 
     } 

     public void Send(JsonResult notification) 
     { 
       Clients.Client(Context.ConnectionId).sendNotification(notification); 
     } 
    } 

समस्या यह है कि है _context.User.Identity.Name हमेशा शून्य है।

क्या ऐसा करने का कोई तरीका है?

+3

अनुरोध पाइपलाइन के बाहर HttpContext तक पहुंच आपदा के लिए एक नुस्खा है अगर आपकी कक्षा को 'user.Identity.Name' की आवश्यकता है तो * * उस डेटा को उस डेटा के साथ निर्मित करें *। यदि आपके पास अपनी कक्षा का निर्माण करते समय 'User.Identity.Name' जैसी किसी चीज़ तक पहुंच नहीं है, तो यह बहुत है संभावना है कि आपको अपनी कक्षा के भीतर स्थिर 'HttpContext' तक पहुंच होगी, वैसे भी। –

+0

@ChrisPratt समस्या यह है कि मुझे हब के कनेक्शन आईडी के साथ उपयोगकर्ता को मैप करने की आवश्यकता है या उपयोगकर्ता को हब के समूह में डालने की आवश्यकता है जहां उपयोगकर्ता एकमात्र सदस्य होगा। अधिसूचना के मामले में, इसे हबकॉन्टेक्स्ट का उपयोग करके नियंत्रक से भेजा जाएगा, इसलिए मुझे इसे केवल एक उपयोगकर्ता को भेजने की आवश्यकता है। –

+0

यदि आप इसे से भेज रहे हैं नियंत्रक, तो आपके पास उस बिंदु पर उपयोगकर्ता को पास करने का अवसर है। जहां सक्रिय है वहां सक्रिय उपयोगकर्ता से बातचीत करना अधिक उचित है। यदि आपका सेटअप इसे करने में समायोजित नहीं करता है, तो यह एक डिज़ाइन समस्या है। –

उत्तर

-3

इस प्रयास करें:

HttpContext.Current.User.Identity.Name 
+1

यह निश्चित रूप से उत्तर नहीं है। –

-1

अपने स्टार्टअप से इस लाइन निकालने का प्रयास करें आपके लिए तैयार रजिस्ट्रार।

-1

मुझे एक ही समस्या थी। मेरे लिए समाधान खत्म होने के अनुरोध पर इंतजार कर रहा था। मैंने एक आदेश प्रकाशित किया और परिणाम पर इंतजार नहीं किया। जैसे

PostSomething() { 
    Task.Run(() => PostCommandAndDontWait()); 
} 

अब मेरे httpContext उपयोगकर्ता के पास अपेक्षित दावे नहीं थे। जब मैंने कार्य को समाप्त करने के लिए इंतजार किया (टास्क.रुन, .Wait() को हटाएं। Reses() आदि .. मेरे पास उपयोगकर्ता को छोड़कर दावों के साथ उपयोगकर्ता था।

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