वर्तमान उपयोगकर्ता कैसे प्राप्त करें, और MVC5 में उपयोगकर्ता वर्ग का उपयोग कैसे करें?


159
  • मैं MVC 5 में वर्तमान में लॉग इन उपयोगकर्ता की आईडी कैसे प्राप्त कर सकता हूं ? मैंने StackOverflow सुझावों की कोशिश की, लेकिन वे MVC 5 के लिए नहीं हैं।
  • इसके अलावा, उपयोगकर्ताओं को सामान आवंटित करने का MVC 5 सबसे अच्छा अभ्यास क्या है? (उदाहरण के लिए एक Userहोना चाहिए Items। चाहिए मैं स्टोर उपयोगकर्ता की Idमें Item? Can मैं विस्तार Userएक साथ वर्ग List<Item>नेविगेशन संपत्ति?

मैं MVC टेम्पलेट से "व्यक्तिगत उपयोगकर्ता खाते" का उपयोग कर रहा हूं।

इनकी कोशिश:

'सदस्यता.गेटयूजर ()' शून्य है।


जो मैंने कोशिश की है उसके संदर्भ जोड़े। अंतिम MVC4 में ठीक था लेकिन MVC5 में नहीं था। इसके अलावा मुझे "उपयोगकर्ता का उपयोग करने" के कुछ सर्वोत्तम अभ्यास की आवश्यकता है :)
एडम स्जाबो

जब आप कहते हैं कि आप MVC 5 का उपयोग कर रहे हैं, तो आप सदस्यता के लिए क्या उपयोग कर रहे हैं? OWin.Security?
एरॉन

MVC टेम्पलेट से "व्यक्तिगत उपयोगकर्ता खाते"।
एडम स्जाबो

3
HttpContext.Current.User.Identity.Nameवर्तमान में लॉग इन उपयोगकर्ता का नाम है।
विकटोर ज़िकला

1
आईडी कैसे प्राप्त करें ? मैं वर्तमान उपयोगकर्ता को Itemवह बनाने के लिए असाइन करना चाहूंगा , लेकिन उपयोगकर्ता नाम पर आधारित नहीं (जो बदल सकता है)। यह 'HttpContext.Current' System.Web.HttpContextBase 'के तरीके से काम नहीं कर रहा है और इसमें' करंट 'की कोई परिभाषा नहीं है और कोई एक्सटेंशन विधि' करंट 'टाइप' System.eb.HttpContextBase 'के पहले तर्क को स्वीकार नहीं कर पाई जा सकती है ( क्या आप एक निर्देश या विधानसभा संदर्भ का उपयोग कर याद कर रहे हैं?) `। क्या आप सुनिश्चित हैं कि आपका समाधान MVC 5 के लिए है?
एडम स्जाबो

जवाबों:


313

यदि आप ASP.NET MVC नियंत्रक में कोडिंग कर रहे हैं, तो उपयोग करें

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

उल्लेख किया गया है User.Identity.IsAuthenticatedऔर User.Identity.Nameउपर्युक्त usingकथन को जोड़े बिना काम करेगा । लेकिन GetUserId()इसके बिना उपस्थित नहीं होंगे।

यदि आप नियंत्रक के अलावा किसी अन्य वर्ग में हैं, तो उपयोग करें

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

MVC 5 के डिफ़ॉल्ट टेम्पलेट में, उपयोगकर्ता आईडी एक स्ट्रिंग के रूप में संग्रहीत एक GUID है।

अभी तक कोई सबसे अच्छा अभ्यास नहीं है, लेकिन उपयोगकर्ता प्रोफ़ाइल का विस्तार करने पर कुछ मूल्यवान जानकारी मिली:


9
ASP.NET MVC 5 के लिए उपयोगकर्ता प्रमाणीकरण और प्राधिकरण बदल गया है। अब यह इंटरफेस और जेनेरिक रिपॉजिटरी के साथ दावा-आधारित प्रमाणीकरण है जिसे आप EF या अन्य प्रदाता के साथ उपयोग कर सकते हैं (EF कार्यान्वयन डिफ़ॉल्ट रूप में आता है)। चूंकि GetUserIdएक विस्तार विधि है, जिसके नीचे Ass_Start\IdentityConfig.cs, जहाँ भी आपको इसका उपयोग करने की आवश्यकता होती है, यदि किसी भिन्न नाम स्थान पर संग्रहीत किया जाता है , तो आपको using Microsoft.AspNet.Identityएक्सटेंशन के दृश्यमान होने के लिए सेट करना होगा ।
एंडरसन माटोस

1
सर्वेक्षण .UserId = Guide.Parse (User.Identity.GetUserId ());
निकोजियासी

यदि मैं उपयोग संदर्भ जोड़ूं तो उपयोगकर्ता अभी भी लाल रंग से रेखांकित है? ऐसा क्यों होगा?
जैपनीजोलिका

@Zapnologica: परियोजना के पुनर्निर्माण की कोशिश, शायद वी.एस.
एडम स्जाबो

5
नोट उपयोगकर्ता केवल एक नियंत्रक में उपलब्ध है msdn.microsoft.com/en-us/library/… (@Zapnologica क्या आप इसे किसी कंट्रोलर के बाहर इस्तेमाल कर रहे हैं? HttpContext.Current.User.Identity
.GetUserId

28

कुछ इस तरह की कोशिश करें:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

RTM के साथ काम करता है।


11
यह अनावश्यक डेटाबेस ट्रिप लगाता है।
अराश

3
@Arash, एप्लिकेशन को डेटाबेस से संपर्क किए बिना उपयोगकर्ता की वस्तु प्राप्त करने के लिए कैसे माना जाता है?
fabspro

2
@ अरश कभी बुरा मत मानना, मैं देख रहा हूं कि तुम्हारा क्या मतलब है। ID को User.Identity.GetUserId () के साथ पुनर्प्राप्त किया जा सकता है; किसी भी डेटाबेस यात्रा के बिना।
फबस्प्रो

Mvc5 (सदस्यता 2) के साथ याद रखें: User.Identity.GetUserId () तालिका में आईडी के साथ अलग है [AspNetUsers]। तो जैकब अर्नोल्ड और रोक सही तरीका है
ग्रे वुल्फ

मैं जवाब से थोड़ा भ्रमित हूं। मुझे एक उपयोगकर्ता प्रकार मिल रहा है जो मेरे नियंत्रक संदर्भ में मौजूद नहीं है। कोई विचार?
झौरलाड एस्ट्रेला

19

यदि आप कोड की एक पंक्ति में ApplicationUser ऑब्जेक्ट चाहते हैं (यदि आपके पास नवीनतम ASP.NET पहचान स्थापित है), तो प्रयास करें:

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

आपको बयानों का उपयोग करते हुए निम्नलिखित की आवश्यकता होगी:

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

ऑब्जेक्ट के लिए नहीं मिला <ApplicationUserManager>
Fandango68

7

Id प्राप्त करना बहुत सीधा है और आपने इसे हल कर लिया है।

आपका दूसरा प्रश्न हालांकि थोड़ा अधिक शामिल है।

इसलिए, यह अभी सभी प्रीलेयरेज सामान है, लेकिन आपके द्वारा सामना की जा रही सामान्य समस्या वह है जहां आप उपयोगकर्ता को नए गुणों (या आपके प्रश्न में एक आइटम संग्रह) के साथ बढ़ा रहे हैं।

बॉक्स से बाहर आपको एक फ़ाइल मिलेगी जिसे IdentityModelमॉडल फ़ोल्डर के तहत (लिखने के समय) कहा जाएगा। वहां आपके पास कुछ कक्षाएं हैं; ApplicationUserऔर ApplicationDbContext। अपने संग्रह को जोड़ने के लिए Itemsआप ApplicationUserकक्षा को संशोधित करना चाहते हैं , ठीक उसी तरह जैसे कि यदि आप एक सामान्य वर्ग हैं जिसका आप एंटिटी फ्रेमवर्क के साथ उपयोग कर रहे हैं। वास्तव में, यदि आप हुड के नीचे एक त्वरित नज़र डालते हैं, तो आप पाएंगे कि सभी पहचान संबंधी कक्षाएं (उपयोगकर्ता, भूमिका आदि ...) उचित डेटा एनोटेशन के साथ अब केवल पीओसीओ हैं ताकि वे ईएफ 6 के साथ अच्छा खेल सकें।

इसके बाद, आपको AccountControllerकंस्ट्रक्टर में कुछ बदलाव करने होंगे ताकि वह आपके DbContext का उपयोग करना जान सके।

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

अब अपने लॉग इन उपयोगकर्ता के लिए पूरी उपयोगकर्ता वस्तु प्राप्त करना थोड़ा ईमानदार होना गूढ़ है।

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

उस लाइन से काम पूरा हो जाएगा और आप userWithItems.Itemsजैसे चाहें पहुंच सकेंगे ।

HTH


मुझे नहीं लगता कि इस सब के लिए पूर्व-रिलीज़ डॉक्स जैसी कोई चीज़ है?
डेरेक टॉम्स

@ डेरेक टोम्स - ऐसा नहीं है कि मैं भर आया हूं। मुझे लगता है कि हमें वास्तविक डॉक्स के लिए 13 नवंबर तक इंतजार करना होगा। यह ईमानदार होने के लिए बहुत अच्छा नहीं है, यहां तक ​​कि uservoice पर बेहतर मार्गदर्शन के लिए एक अनुरोध भी है - Aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unn

ठीक है, लेकिन मुझे किस प्रकार का उदाहरण मिलता है AccountController?
घोंसला

0

मुझे आपका दर्द महसूस हो रहा है, मैं भी यही करने की कोशिश कर रहा हूं। मेरे मामले में मैं केवल उपयोगकर्ता को साफ़ करना चाहता हूँ।

मैंने एक आधार नियंत्रक वर्ग बनाया है जो मेरे सभी नियंत्रकों को विरासत में मिला है। इसमें मैंने ओवरराइड किया OnAuthenticationऔर सेट कियाfilterContext.HttpContext.User to null

यह सबसे अच्छा मैं दूर तक कामयाब रहा है ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}

0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

कृपया केवल विशेष रूप से बिना किसी टिप्पणी के पोस्ट कोड न करें। यदि आप अपना कोड बताते हैं तो यह अधिक सहायक होगा।
अली कनाट

0

अगर किसी और की यह स्थिति है: मैं अपने ऐप में लॉग इन करने के लिए एक ईमेल सत्यापन बना रहा हूं, तो मेरे उपयोगकर्ताओं ने अभी तक प्रवेश नहीं किया है, हालांकि मैंने लॉगिन पर दर्ज किए गए ईमेल की जांच करने के लिए नीचे का उपयोग किया है जो @firecape समाधान की विविधता है

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

आपको निम्नलिखित की भी आवश्यकता होगी:

using Microsoft.AspNet.Identity;

तथा

using Microsoft.AspNet.Identity.Owin;


0

इस तरह से मुझे एक एस्पेनाउज़र आईडी मिला और इसे अपने होम पेज पर प्रदर्शित किया

मैंने अपने होमकंट्रोलर इंडेक्स () विधि में निम्नलिखित कोड रखा

ViewBag.userId = User.Identity.GetUserId();

व्यू पेज में सिर्फ कॉल करें

ViewBag.userId 

प्रोजेक्ट को चलाएं और आप अपने उपयोगकर्ता को देख पाएंगे

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