2014-12-29 11 views
13

एमवीसी 5 एएसपीनेट पहचान 2.0उपयोगकर्ता नाम पहचान का उपयोगकर्ता आईडी 2.0

मैं समझता हूं कि वर्तमान में लॉग इन उपयोगकर्ता आईडी कैसे प्राप्त करें। मुझे सिस्टम में किसी भिन्न उपयोगकर्ता की उपयोगकर्ता आईडी प्राप्त करने की आवश्यकता है। यह कैसे किया जाता है?

पूर्व। मुझे उपयोगकर्ता नाम "fsmith" की उपयोगकर्ता आईडी प्राप्त करने की आवश्यकता है ...

+0

इस मुद्दे के लिए, मैं वास्तव में एक अलग नियंत्रक में हूं - खाता नियंत्रक नहीं। आप उपयोगकर्ता प्रबंधक संदर्भ को एक अलग नियंत्रक से कैसे प्राप्त करते हैं? –

उत्तर

21

लेखा और लेखा के अंदर: मन में यह घोषित करने निर्भरता इंजेक्शन का उपयोग करते समय) उदाहरण के लिए, के कई तरीके हैं कि tController आप उपयोगकर्ता ऑब्जेक्ट प्राप्त करने के लिए निम्न विधि को कॉल कर सकते हैं और फिर उपयोगकर्ता आईडी प्राप्त कर सकते हैं।

var user = await UserManager.FindByNameAsync(userName); 
var userId = user.Id; 

आप AccountController अंदर नहीं हैं, तो आप शशि की उपयोगी जवाब देने के लिए जोड़ने के लिए निम्न कोड

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
+0

ठीक है - करीब आ रहा है। मेरे पास उपयोगकर्ता प्रबंधक संदर्भ है।अब मैं इंतजार एक async विधि की आवश्यकता होगी, आदि के बारे में कुछ –

+1

तुम बस के रूप में 'वर उपयोगकर्ता = UserManager.FindByName (उपयोगकर्ता नाम) इस प्रकार तुल्यकालिक विधि कह सकते हैं कह आईडीई में कोई त्रुटि हो रही है,' वैकल्पिक रूप से, आप निम्नलिखित नियंत्रक का उपयोग कर अपने नियंत्रक को एक Async विधि क्रिया कर सकते हैं। 'सार्वजनिक एसिंक कार्य YourControllerAction (...) ' async उपयोग के बारे में जांचें। –

+0

गैर-एसिंक काम किया! –

1

एक तरीका आपके उपयोगकर्ता प्रबंधक (या इसका सामान्य संस्करण) FindByNameAsync विधि का उपयोग करना होगा। यह उपयोगकर्ता का नाम लेता है (आपके मामले में "fsmith") और उपयोगकर्ता ऑब्जेक्ट का कार्य देता है। इस उपयोगकर्ता ऑब्जेक्ट में उस उपयोगकर्ता के बारे में उपलब्ध सभी जानकारी शामिल है।

एक कोड स्निपेट के बाद एक जैसे ही लगते सकता है (यदि आप डेटाबेस आईडी के लिए देख रहे हैं):

var user = await UserManager.FindByNameAsync("fsmith"); 
var userId = user.Id; 

संपादित

UserManager उदाहरण सामान्य रूप से इस प्रकार घोषित किया जाता है (रखने

public AccountController() 
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))) 
{ 
} 

public AccountController(UserManager<ApplicationUser> userManager) 
{ 
    UserManager = userManager; 
} 

public UserManager<ApplicationUser> UserManager { get; private set; } 
+0

आपको "उपयोगकर्ता प्रबंधक" संदर्भ कैसे मिलता है? –

+0

मेरी पोस्ट में संपादन देखें। विजुअल स्टूडियो टेम्पलेट का उपयोग करते समय आपको अपने ** AccountController ** के अंदर घोषणा मिलनी चाहिए। –

3

का उपयोग कर UserManager संदर्भ प्राप्त कर सकते हैं ...

आप खाते के अंदर कर रहे हैं नियंत्रक आप मौजूदा उपयोगकर्ता प्रबंधक का उपयोग कर सकते हैं:

var user = await UserManager.FindByNameAsync(userName); 
var userId = user.Id; 

अन्य नियंत्रक में रों (और शायद अन्य स्थानों का चयन करें जहां HttpContext उपलब्ध है) आप के साथ एक उपयोगकर्ता प्रबंधक बनाने के लिए:

var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

लेकिन क्या यह मुझे कुछ समय लिया साकार करने के लिए आप यह पिछले बिट के साथ जहां कहीं भी इसे प्राप्त कर सकते है। मिसाल के तौर पर मैं इसे (Configuration.cs में) मेरे बीज विधि में इस्तेमाल किया तो मैं एक और मॉडल के उपयोगकर्ता संपत्ति बीज सकता है:

var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(*insert-your-db-context-here*)); 
+0

यह अधिक सटीक उत्तर है। –

0

आप टोकन प्रमाणीकरण असर का उपयोग कर रहे हैं, तो ऊपर नमूना नहीं लौटते एप्लिकेशन को उपयोगकर्ता के ।

ClaimsPrincipal currentUser = this.User; 
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; 
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName); 
return user.Id; 

यह apsnetcore 2.0 में काम करता है:

इसके बजाय, इस का उपयोग करें। पिछले संस्करणों में कोशिश नहीं की है।

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