কীভাবে বর্তমান ব্যবহারকারী পাবেন এবং এমভিসি 5 তে ব্যবহারকারী শ্রেণিটি কীভাবে ব্যবহার করবেন?


159
  • আমি বর্তমানে এমভিসি 5-তে লগ ইন হওয়া ব্যবহারকারীর আইডি কীভাবে পেতে পারি ? আমি স্ট্যাকওভারফ্লো পরামর্শগুলি চেষ্টা করেছিলাম, তবে সেগুলি এমভিসি 5 এর জন্য নয় বলে মনে হচ্ছে।
  • এছাড়াও, ব্যবহারকারীদের স্টাফ দেওয়ার ক্ষেত্রে এমভিসি 5 টির সেরা অনুশীলন কী? (উদাহরণস্বরূপ একটি Userথাকা উচিত ItemsI আমি কি ব্যবহারকারীর Idমধ্যে থাকা উচিত Item? আমি কি Userকোনও List<Item>নেভিগেশন সম্পত্তি দিয়ে ক্লাসটি বাড়িয়ে দিতে পারি ?

আমি এমভিসি টেম্পলেট থেকে "স্বতন্ত্র ব্যবহারকারী অ্যাকাউন্টগুলি" ব্যবহার করছি।

এগুলি চেষ্টা করে:

'মেম্বারশিপ.গেট ইউজার ()' বাতিল।


আমি যা চেষ্টা করেছি তার রেফারেন্স যুক্ত করেছি। শেষটি এমভিসি 4 তে ঠিক আছে তবে এমভিসি 5 তে নয়। এছাড়াও আমার "ব্যবহারকারীর ব্যবহার" এর কয়েকটি সেরা অনুশীলন দরকার :)
অ্যাডাম সাজাবো

আপনি যখন বলেন যে আপনি এমভিসি 5 ব্যবহার করছেন, আপনি সদস্যতার জন্য কী ব্যবহার করছেন? OWin.Security?
অ্যারন

এমভিসি টেমপ্লেট থেকে "স্বতন্ত্র ব্যবহারকারী অ্যাকাউন্টগুলি"।
অ্যাডাম জাজো

3
HttpContext.Current.User.Identity.Nameবর্তমানে লগ ইন করা ব্যবহারকারীর নাম।
উইক্টর জ্যাচলা

1
কিভাবে আইডি পাবেন ? আমি বর্তমান ব্যবহারকারীকে Itemতার তৈরি করাতে নির্ধারিত করতে চাই , তবে ব্যবহারকারীর নাম ভিত্তিতে নয় (এটি পরিবর্তিত হতে পারে)। এটি working এইচটিটিপি কনটেক্সট.কন্টেনার 'সিস্টেম. ওয়েবে.এইচটিপি কনটেক্সটবেস' -র জন্য 'কারেন্ট' এর সংজ্ঞা নেই এবং কোনও এক্সটেনশন পদ্ধতি 'কারেন্ট' টাইপ করে প্রথমে 'সিস্টেম.ওয়েব.এইচটিপি কনটেক্সটবেস' টাইপের প্রথম আর্গুমেন্টকে খুঁজে পাওয়া যায়নি (এই পদ্ধতিতে এটি কাজ করে না ( আপনি কি কোনও ব্যবহার নির্দেশনা বা কোনও সমাবেশের রেফারেন্স মিস করছেন?) `` আপনি কি নিশ্চিত যে আপনার সমাধান এমভিসি 5 এর জন্য?
অ্যাডাম সাজাবো

উত্তর:


313

আপনি যদি কোনও এএসপি.নেট এমভিসি নিয়ামককে কোড করে থাকেন তবে ব্যবহার করুন

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

উল্লেখযোগ্য User.Identity.IsAuthenticatedএবং User.Identity.Nameএটি উল্লিখিত usingবিবৃতিটি যুক্ত না করেই কাজ করবে । তবে GetUserId()এটি ছাড়া উপস্থিত হবে না।

আপনি যদি নিয়ামক ব্যতীত অন্য কোনও শ্রেণিতে থাকেন তবে ব্যবহার করুন

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

এমভিসি 5 এর ডিফল্ট টেম্পলেটে, ব্যবহারকারী আইডি একটি স্ট্রিং হিসাবে সঞ্চিত একটি জিইউডি।

এখনও সেরা অনুশীলন হয়নি, তবে ব্যবহারকারী প্রোফাইল প্রসারিত করার জন্য কিছু মূল্যবান তথ্য খুঁজে পেয়েছে:


9
এএসপি.নেট এমভিসি ৫ এর জন্য ব্যবহারকারীর প্রমাণীকরণ এবং অনুমোদন পরিবর্তিত হয়েছে Now এখন এটি ইন্টারফেস এবং জেনেরিক সংগ্রহস্থলগুলির সাথে দাবি ভিত্তিক প্রমাণীকরণ যা আপনি EF বা অন্য সরবরাহকারীর সাথে ব্যবহার করতে পারেন (EF বাস্তবায়ন ডিফল্ট হিসাবে আসে)। যেহেতু GetUserIdনীচের অংশে সংরক্ষণ করা একটি এক্সটেনশন পদ্ধতি Ass_Start\IdentityConfig.cs, আপনার যেখানেই এটি ব্যবহার করা দরকার, যদি কোনও ডিফেরেন্ট নেমস্পেসে থাকে তবে আপনাকে using Microsoft.AspNet.Identityএক্সটেনশনটি দৃশ্যমান হওয়ার জন্য সেট করতে হবে ।
অ্যান্ডারসন ম্যাটোস

1
জরিপ.ইউজারআইডি = গাইড. পার্স (ইউজার.আইডেন্টিটি.গেট ইউজারআইডি ());
নিকো জুইসিস

আমি যদি ব্যবহারের রেফারেন্সটি যুক্ত করি তবে ব্যবহারকারী কি এখনও রেডলাইন लाल? কেন এমন হবে?
Zapnologica

@ জাপনোলজিকা: প্রকল্পটি পুনর্নির্মাণের চেষ্টা করুন, সম্ভবত ভিএস ইন্টেলিজেন্স কিছুটা ধীর গতিতে।
অ্যাডাম সাজাবো

5
উল্লেখ্য ব্যবহারকারী একটি কন্ট্রোলার শুধুমাত্র উপলব্ধ msdn.microsoft.com/en-us/library/... (@Zapnologica আপনি বাইরে ব্যবহার করছেন একটি নিয়ামক এর HttpContext.Current.User.Identity.GetUserId (চেষ্টা);?)
Adween

28

এর মতো কিছু চেষ্টা করুন:

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

আরটিএম নিয়ে কাজ করে।


11
এটি অপ্রয়োজনীয় ডাটাবেস ট্রিপ আরোপ করে।
আরশ

3
@ আরশ, ডাটাবেসটির সাথে যোগাযোগ না করে অ্যাপ্লিকেশনটি ব্যবহারকারীর অবজেক্টটি পাওয়ার কথা কীভাবে?
ফেবস্প্রো

2
@ আরশ কিছু মনে করবেন না, আমি আপনার বোঝাতে চাইছি। আইডিটি ব্যবহারকারী.আইডেন্টিটি.গেট ইউজারআইডি () দিয়ে পুনরুদ্ধার করা যেতে পারে; কোনও ডাটাবেস ট্রিপ ছাড়া।
ফাবস্প্রো 8:38 এ 814 এ

এমভিসি 5 (সদস্যতা 2) এর সাথে মনে রাখবেন: ইউজার.আইডেন্টিটি.গেট ইউজারআইডি () টেবিলের আইডি (এসপনেট ব্যবহারকারীদের) থেকে পৃথক। সুতরাং জাকুব আর্নল্ড এবং রকের সঠিক উপায়
গ্রে ওল্ফ

আমি উত্তরটি নিয়ে কিছুটা বিভ্রান্ত। আমি একটি ইউজার স্টোর টাইপ পাচ্ছি আমার নিয়ন্ত্রণকারীর প্রসঙ্গে মনে হচ্ছে না। কোন ধারনা?
ঝুরলাদ এস্ট্রেলা

19

আপনি যদি কোডের এক লাইনে অ্যাপ্লিকেশন ব্যবহারকারী অবজেক্টটি চান (যদি আপনার সর্বশেষে 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;

<অ্যাপ্লিকেশন ব্যবহারকারী ব্যবহারকারী
Fandango68

7

আইডি পাওয়া বেশ সোজা এগিয়ে এবং আপনি এটি সমাধান করেছেন।

আপনার দ্বিতীয় প্রশ্নটি যদিও খানিকটা জড়িত।

সুতরাং, এই মুহুর্তে এখনই সমস্ত প্রাকট্রিজ স্টাফ, তবে আপনি যে সাধারণ সমস্যাটির মুখোমুখি হচ্ছেন তা হ'ল আপনি যেখানে নতুন বৈশিষ্ট্য (বা আপনার প্রশ্নের কোনও আইটেম সংগ্রহ) দিয়ে ব্যবহারকারীকে প্রসারিত করছেন।

বাক্সের বাইরে আপনি IdentityModelমডেল ফোল্ডারের অধীনে ডাকা একটি ফাইল পাবেন (লেখার সময়)। সেখানে আপনার কয়েকটি ক্লাস রয়েছে; ApplicationUserএবং ApplicationDbContext। আপনার সংগ্রহটি যুক্ত করতে Itemsআপনি ApplicationUserক্লাসটি সংশোধন করতে চাইবেন ঠিক যেমন আপনি যদি হ'ত যদি সত্তা ফ্রেমওয়ার্কের সাথে আপনি যদি এই সাধারণ শ্রেণিটি ব্যবহার করছিলেন। প্রকৃতপক্ষে, আপনি যদি হুডের নীচে তাত্ক্ষণিকভাবে নজর রাখেন তবে আপনি দেখতে পাবেন যে সমস্ত পরিচয় সম্পর্কিত ক্লাস (ব্যবহারকারী, ভূমিকা ইত্যাদি ...) এখন যথাযথ ডেটা টীকা সহ কেবলমাত্র পোকো তাই তারা EF6 এর সাথে দুর্দান্ত খেলেন।

এর পরে, আপনাকে AccountControllerকন্সট্রাক্টরে কিছু পরিবর্তন করতে হবে যাতে এটি আপনার ডিবি কনটেক্সটটি ব্যবহার করতে পারে।

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 নভেম্বর পর্যন্ত অপেক্ষা করতে হবে। এটি সত্যই বলে মনে হয় নি দুর্দান্ত, ইউজারভয়েসে আরও ভাল দিকনির্দেশনার জন্য একটি অনুরোধ এমনকি রয়েছে - aspnet.uservoice.com/forums/41199-
জেনারাল-

ঠিক আছে তবে আমি কীভাবে টাইপের উদাহরণ পেতে পারি 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

অন্য কারও যদি এই পরিস্থিতি থাকে: আমি আমার অ্যাপটিতে লগ ইন করতে ইমেল যাচাইকরণ তৈরি করছি যাতে আমার ব্যবহারকারীরা এখনও সাইন ইন না করে থাকেন, তবে আমি লগইনে প্রবেশ করা ইমেল যাচাইয়ের জন্য নীচেরটি ব্যবহার করেছি যা @ ফায়ারকেপ সমাধানের ভিন্নতা is

 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 

প্রকল্পটি চালান এবং আপনি আপনার ব্যবহারকারী আইডি দেখতে সক্ষম হবেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.