दिलचस्प पोस्ट
कॉर्डोवा प्लगइन विकास – एआर जोड़ना Xlib के साथ एक स्क्रीनशॉट कैसे सही ढंग से लेती है? जावा एसएसएल और प्रमाणपत्र कीस्टस्टोर एक अनाम फ़ंक्शन के साथ कक्षा संपत्ति को प्रारंभ करें मैं एक पाइप कैसे शामिल करूं? | मेरे लिनक्स खोज -एक्सएसी कमांड में? जावा में, स्ट्रिंग x के लिए, s.length () की रनटाइम लागत क्या है? क्या यह ओ (1) या ओ (एन) है? रैवल्यू रेफरेंस का प्रयोग लालगू के रूप में किया जाता है? एंड्रॉइड एप्लीकेशन में कैश्ड को साफ़ करें इसका क्या मतलब है? "'NSUnknownKeyException', कारण: … यह वर्ग कुंजी मान कुंजी कोड के लिए कोडिंग-अनुरूप नहीं है" आईफोन 6 / आईओएस 8 के साथ एनएफसी टैग पढ़ना किसी संख्या में मैं अंकों की कुल संख्या कैसे प्राप्त करूं? जावा जेनेरिक्स – पुल विधि? Django: स्ट्रिंग से मॉडल प्राप्त करें? यूनिकोड वर्ण कितने बाइट लेते हैं? पिकासो लाइब्रेरी, एंड्रॉइड: त्रुटि सुनने वाला का उपयोग करना

एएसपी.नेट एमवीसी 5 – पहचान वर्तमान अनुप्रयोग उपयोगकर्ता कैसे प्राप्त करें

मेरे पास प्रोजेक्ट इकाई है, जिसमें मेरे पास ApplicationUser संपत्ति नाम Author । वर्तमान में लॉग किए गए ApplicationUser पूर्ण ऑब्जेक्ट को मैं कैसे प्राप्त करूं? नए लेख का निर्माण करते समय मुझे लेख की संपत्ति को वर्तमान ApplicationUser से सेट करना होगा

पुरानी सदस्यता तंत्र में यह सरल था लेकिन नए पहचान दृष्टिकोण में मुझे नहीं पता कि यह कैसे करना है।

मैंने ऐसा करने की कोशिश की:

  • पहचान एक्सटेंशन के लिए कथन का प्रयोग करें: using Microsoft.AspNet.Identity;
  • फिर मैं वर्तमान उपयोगकर्ता प्राप्त करने का प्रयास करता हूं: ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

लेकिन मुझे अपवाद मिलता है:

LINQ को इकाईयों को 'System.String GetUserId (System.Security.Principal.IIdentity)' विधि की पहचान नहीं होती है, और यह विधि स्टोर अभिव्यक्ति में अनुवाद नहीं की जा सकती स्रोत = EntityFramework

Solutions Collecting From Web of "एएसपी.नेट एमवीसी 5 – पहचान वर्तमान अनुप्रयोग उपयोगकर्ता कैसे प्राप्त करें"

आपको मौजूदा अनुप्रयोग उपयोगकर्ता के लिए सीधे डेटाबेस से क्वेरी करने की आवश्यकता नहीं होनी चाहिए।

यह शुरुआत के लिए एक अतिरिक्त संदर्भ रखने की नई निर्भरता का परिचय देता है, लेकिन उपयोगकर्ता डेटाबेस तालिका परिवर्तन (पिछले 2 वर्षों में 3 गुणा) आगे जा रहा है, लेकिन एपीआई सुसंगत है। उदाहरण के लिए, users तालिका अब पहचान फ़्रेमवर्क में AspNetUsers नामक है, और कई प्राथमिक कुंजी के नाम बदलते रहते हैं, इसलिए कई उत्तरों में कोड अब -जैसा काम नहीं करेगा।

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

वर्तमान उपयोगकर्ता ऑब्जेक्ट को एएसपी.Net पहचान में उपयोग करने का सही तरीका (इस तिथि के अनुसार) है:

 var user = UserManager.FindById(User.Identity.GetUserId()); 

या, यदि आपके पास एक async कार्रवाई है, तो ऐसा कुछ:

 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

FindById लिए आपके पास निम्न का उपयोग करने की आवश्यकता है ताकि गैर- async UserManager विधियां उपलब्ध हो सकें (वे FindByIdAsync लिए एक्सटेंशन विधियां हैं, इसलिए यदि आप इसे शामिल नहीं करते हैं तो आप केवल FindByIdAsync देखेंगे):

 using Microsoft.AspNet.Identity; 

यदि आप बिल्कुल नियंत्रक में नहीं हैं (उदाहरण के लिए आप आईओसी इंजेक्शन का उपयोग कर रहे हैं), तो यूजर आईडी से पूर्ण में पुनर्प्राप्त किया जाता है:

 System.Web.HttpContext.Current.User.Identity.GetUserId(); 

यदि आप मानक खाता नियंत्रक में नहीं हैं तो आपको अपने नियंत्रक को निम्नलिखित (एक उदाहरण के रूप में) जोड़ना होगा:

1. इन दो गुणों को जोड़ें:

  /// <summary> /// Application DB context /// </summary> protected ApplicationDbContext ApplicationDbContext { get; set; } /// <summary> /// User manager - attached to application DB context /// </summary> protected UserManager<ApplicationUser> UserManager { get; set; } 

2. इस नियंत्रक के निर्माता में जोड़ें:

  this.ApplicationDbContext = new ApplicationDbContext(); this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext)); 

मार्च 2015 को अपडेट करें

नोट: पहचान ढांचे का सबसे हालिया अपडेट प्रमाणीकरण के लिए उपयोग किए जाने वाले अंतर्निहित वर्गों में से एक को बदलता है। अब आप इसे वर्तमान एचटीटीपी कंटेंट के ओविन संदर्भ से एक्सेस कर सकते हैं।

 ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

परिशिष्ट:

एज़ूर के साथ ईएफ और आइडेंटिटी फ्रेमवर्क का उपयोग करते समय दूरस्थ डेटाबेस कनेक्शन (उदाहरण के लिए Azure डेटाबेस से स्थानीय होस्ट परीक्षण) पर, आप बेतरतीब ढंग से खतरनाक "त्रुटि: 1 9 – भौतिक कनेक्शन उपयोग करने योग्य नहीं" हिट कर सकते हैं। जैसा कारण पहचान फ़्रेमवर्क के अंदर दफन हो जाता है, जहां आप फिर से कोशिश नहीं कर सकते (या जो अनुपलब्ध प्रतीत होता है .Include(x->someTable) ), आपको अपने प्रोजेक्ट में एक कस्टम SqlAzureExecutionStrategy को लागू करना होगा।

मेरी गलती, मुझे एक LINQ क्वेरी के अंदर एक विधि का इस्तेमाल नहीं करना चाहिए था।

सही कोड:

 string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); 

इसकी उत्तर की टिप्पणी में, लेकिन कोई भी इसे वास्तविक समाधान के रूप में नहीं पोस्ट किया है।

आपको बस शीर्ष पर उपयोग करने वाले कथन को जोड़ने की जरूरत है:

 using Microsoft.AspNet.Identity; 

एल्बार का कोड काम करता है! आपको केवल उपयोग करने की आवश्यकता है

1 – using Microsoft.AspNet.Identity;

और … एल्बार का कोड:

2 – string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

इस कोड के साथ ( currentUser ), आप कनेक्ट उपयोगकर्ता के सामान्य डेटा काम करते हैं, यदि आप अतिरिक्त डेटा चाहते हैं … यह लिंक देखें

एएसपी। नेट पहचान 3.0.0 के अनुसार, इसे पुन:

 //returns the userid claim value if present, otherwise returns null User.GetUserId(); 
 ApplicationDbContext context = new ApplicationDbContext(); var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId()); string ID = currentUser.Id; string Email = currentUser.Email; string Username = currentUser.UserName; 

अभी एएसपी.एमवीसी प्रोजेक्ट टेम्पलेट एक खाता नियंत्रक बनाता है जो कि इस तरह के उपयोगकर्ता को प्राप्त करता है:

 HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>() 

मेरे लिए निम्नलिखित कार्य:

 ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId()); 

एमवीसी 5 के लिए सिर्फ WebApplication टेम्पलेट स्कैफोल्ड में ManageController के EnableTwoFactorAuthentication विधि के अंदर देखें, इसकी वहां किया जा रहा है:

  [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); } 

इसका जवाब सही है, जैसा कि माइक्रोसॉफ्ट द्वारा सुझाया गया है:

 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

आपके पास ApplicationUser वर्ग में परिभाषित सभी अतिरिक्त गुण हैं।