एक ApiController कार्रवाई के भीतर, एक पैरामीटर के रूप में userID पारित किए बिना, वर्तमान उपयोगकर्ता प्राप्त करें


97

हम उपयोगकर्ता नाम या पैरामीटर के रूप में एक पैरामीटर के बिना, सुरक्षित ApiController कार्रवाई के भीतर वर्तमान उपयोगकर्ता कैसे प्राप्त कर सकते हैं?

हम मानते हैं कि यह उपलब्ध है, क्योंकि हम एक सुरक्षित कार्रवाई के भीतर हैं। सुरक्षित क्रिया में होने का अर्थ है कि उपयोगकर्ता पहले ही प्रमाणित कर चुका है और अनुरोध में उसका वाहक टोकन है। यह देखते हुए कि वेबएपीआई ने उपयोगकर्ता को अधिकृत किया है, उपयोगकर्ताआईड तक पहुंचने के लिए एक अंतर्निहित तरीका हो सकता है, बिना इसे एक पैरामीटर के रूप में पारित करने के लिए।


कृपया इस उत्तर को देखें: stackoverflow.com/a/26453782/3290276 यह दावा करें कि चाल
चली गई

जवाबों:


149

WebApi 2 में आप RequestContext.PrincipalApiController पर एक विधि के भीतर से उपयोग कर सकते हैं


1
हमारे पास वह संपत्ति नहीं है, ऐसा लगता है। हम्म। शायद हम WebApi के पुराने संस्करण का उपयोग कर रहे हैं।
शॉन लुटिन

2
@ShaunLuttin ठीक है, इसलिए यदि आप वेब एपीआई 1 का उपयोग कर रहे हैं, तो मेरा मानना ​​है कि ApiController पर एक प्रिंसिपल संपत्ति है। यह Request.Properties संग्रह तक पहुँचने के लिए सिर्फ एक फैंसी रैपर है। प्रिंसिपल ऑब्जेक्ट को उस शब्दकोश में संग्रहीत किया जाता है।
डारेल मिलर

6
बस भूल नहीं हैusing Microsoft.AspNet.Identity;
अधिपति

1
@DarrelMiller कोड के अन्य हिस्सों (नियंत्रक के भीतर नहीं) से समान (कहने का अनुरोध संदर्भ) प्राप्त करने का एक तरीका है।
अजय आराध्या

2
@ अजय आराध्या अगर आप वहां से गुजरती हैं। वेब फ्रेमवर्क पर पिछले प्रयासों से पता चला है कि अनुरोध संदर्भ के लिए स्थैतिक गुणों का उपयोग करने से सभी प्रकार की वास्तु संबंधी समस्याएं होती हैं। यह पहली बार में सुविधाजनक है, लेकिन यह बहुत लंबे समय तक दर्द का कारण बनता है।
डारेल मिलर

36

तुम भी Userसंपत्ति का उपयोग कर प्रिंसिपल का उपयोग कर सकते हैं ApiController

तो निम्नलिखित दो कथन मूल रूप से समान हैं:

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();

15
मैं यहाँ आपके द्वारा लिखे गए का उपयोग करने का प्रयास कर रहा हूँ, लेकिन GetUserId () फ़ंक्शन हमेशा अशक्त रहता है। उपयोगकर्ता सामान्य है, मैं एक वाहक टोकन पास कर रहा हूं, और ApiController के पास [अधिकृत] शीर्षलेख
जोशुआ ओहाना

GetUserId () फ़ंक्शन केवल एक ID लौटाता है यदि उपयोगकर्ता के पास NameIdentifier का दावा है। इसे कैसे हल किया जाए, इसके एक उदाहरण के लिए, ओसवाल्डो के जवाब का यहां उल्लेख करें: stackoverflow.com/questions/19505526
jramm

14

संकेत Webapi2 ऑटो उत्पन्न खाता नियंत्रक में निहित है

इस संपत्ति को गेट्टर के रूप में परिभाषित करें

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

और UserManager को पाने के लिए - WebApi2 -do में रोमन के रूप में (अकाउंटकंट्रोलर के रूप में पढ़ें) करते हैं

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

यह IIS और सेल्फ होस्ट मोड में संगत होना चाहिए


7

ऊपर दिए गए किसी भी सुझाव ने मेरे लिए काम नहीं किया। निम्नलिखित ने किया!

HttpContext.Current.Request.LogonUserIdentity.Name

मुझे लगता है कि कई तरह के परिदृश्य हैं और यह मेरे लिए काम करता है। मेरे परिदृश्य में एक AngularJS फ्रंटेंड और एक वेब API 2 बैकएंड एप्लिकेशन शामिल है, दोनों IIS के तहत चल रहे हैं। मुझे Windows प्रमाणीकरण के तहत विशेष रूप से चलाने के लिए दोनों एप्लिकेशन सेट करने थे ।

किसी भी उपयोगकर्ता की जानकारी को पारित करने की आवश्यकता नहीं है। ब्राउज़र और IIS उपयोगकर्ता क्रेडेंशियल्स पर लॉग इन का आदान-प्रदान करते हैं और वेब एपीआई के पास उपयोगकर्ता क्रेडेंशियल्स की मांग (आईआईएस आई स्वीकार से) तक पहुंच है।


6

करन भंडारी का जवाब अच्छा है, लेकिन एक परियोजना में जोड़ा गया खाता नियंत्रक बहुत संभावना है Mvc.Controller। ApiController परिवर्तन में उपयोग के लिए अपने उत्तर को बदलने के HttpContext.Current.GetOwinContext()लिए Request.GetOwinContext()और सुनिश्चित करें कि आपने निम्नलिखित 2 usingकथन जोड़े हैं :

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

5

User.Identity.Nameउपयोगकर्ता के नाम दावे को प्राप्त करने के लिए .Net कोर का उपयोग करें।


2
User.Identity.Nameनाम के दावे का मूल्य मिलता है । यह सक्रिय निर्देशिका-विशिष्ट नहीं है।
नैट बारबेटिनी

@ अपनी टिप्पणी के लिए धन्यवाद, मैंने इसे ठीक कर दिया है
वेंकटेश मुनिंदी

3

यदि आप Asp.Identity UseManager का उपयोग कर रहे हैं, तो यह स्वचालित रूप से मान सेट करता है

RequestContext.Principal.Identity.GetUserId ()

के आधार पर IdentityUser आप बनाने में उपयोग करने IdentityDbContext

यदि कभी आप एक कस्टम यूजर टेबल और ओइन टोकन बियरर प्रमाणीकरण को लागू कर रहे हैं, तो कृपया मेरे उत्तर की जांच करें।

वेब एप कॉल के दौरान उपयोगकर्ता संदर्भ कैसे प्राप्त करें?

आशा है कि यह अभी भी मदद करता है। :)


1
string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null 
        && HttpContext.Current.User.Identity.Name != null)
{
    userName = HttpContext.Current.User.Identity.Name;
    userId = HttpContext.Current.User.Identity.GetUserId();
}

या डारेल मिलर की टिप्पणी के आधार पर, शायद पहले HttpContext को पुनः प्राप्त करने के लिए इसका उपयोग करें।

// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);    

यह सभी देखें:

HTTPContext को अपने वेब एपीआई कार्रवाई के भीतर से कैसे एक्सेस करें


5
HttpContext का उपयोग न करें क्योंकि यह आपके होस्टिंग विकल्पों को सीमित करता है और आपके कोड को परीक्षण के लिए कठिन बनाता है।
डारेल मिलर

HttpContext ऑब्जेक्ट डिक्शनरी में नहीं होगा यदि आप सेल्फ-होस्ट हैं, या OwinHttpListener होस्ट किया गया है
डारेल मिलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.