এএসপি.নেট এমভিসি 5 - পরিচয়। কীভাবে বর্তমান অ্যাপ্লিকেশন ব্যবহারকারী পাবেন?


237

আমার প্রজেক্টে আমার একটি আর্টিকেল সত্তা রয়েছে যার ApplicationUserনামটির সম্পত্তি রয়েছে Author। আমি বর্তমানে লগ ইন সম্পূর্ণ বস্তু পেতে পারি ApplicationUser? একটি নতুন নিবন্ধ তৈরি করার সময়, আমি সেট করতে Authorসম্পত্তি Articleবর্তমান ApplicationUser

পুরানো সদস্যপদ ব্যবস্থায় এটি সহজ ছিল, তবে নতুন পরিচয় পদ্ধতির মধ্যে আমি কীভাবে এটি করব তা জানি না।

আমি এটি এইভাবে করার চেষ্টা করেছি:

  • পরিচয় এক্সটেনশনের জন্য বিবৃতি ব্যবহার করে যুক্ত করুন: using Microsoft.AspNet.Identity;
  • তারপরে আমি বর্তমান ব্যবহারকারীকে পাওয়ার চেষ্টা করি: ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

তবে আমি নিম্নলিখিত ব্যতিক্রম পাই:

সংস্থাগুলিতে লিনকিউ 'সিস্টেম.স্ট্রিং গেট ইউজারআইডি (সিস্টেম.সিকিউরিটি। প্রিন্সিপাল.আইআইডেন্টিটি)' পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশনে অনুবাদ করা যায় না। উত্স = EntityFramework

উত্তর:


448

আপনার বর্তমান অ্যাপ্লিকেশন ব্যবহারকারীটির জন্য সরাসরি ডাটাবেসটি জিজ্ঞাসা করার দরকার নেই।

এটি সূচনাকারীদের জন্য অতিরিক্ত প্রসঙ্গ থাকার একটি নতুন নির্ভরতা প্রবর্তন করে তবে ব্যবহারকারী ডাটাবেস সারণি পরিবর্তন (গত 2 বছরে 3 বার) তবে এপিআই সুসংগত। উদাহরণস্বরূপ usersএখন টেবিলটিকে AspNetUsersআইডেন্টিটি ফ্রেমওয়ার্কে ডাকা হয় এবং বেশ কয়েকটি প্রাথমিক কী ক্ষেত্রের নাম পরিবর্তন করা থাকে, তাই বেশ কয়েকটি উত্তরে কোডটি আর যেমন হয় তেমন কাজ করবে না ।

আর একটি সমস্যা হ'ল ডাটাবেসে অন্তর্নিহিত OWIN অ্যাক্সেসটি একটি পৃথক প্রসঙ্গ ব্যবহার করবে, সুতরাং পৃথক এসকিউএল অ্যাক্সেস থেকে পরিবর্তনগুলি অবৈধ ফলাফল আনতে পারে (যেমন, ডাটাবেসে পরিবর্তনগুলি না দেখে)। আবার সমাধানটি হ'ল সরবরাহ করা এপিআই দিয়ে কাজ করা এবং এর আশেপাশে কাজ করার চেষ্টা না করা।

এএসপি. নেট পরিচয় (এই তারিখের মতো) এ বর্তমান ব্যবহারকারী অবজেক্টটি অ্যাক্সেস করার সঠিক উপায় হ'ল:

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

বা, আপনার যদি অ্যাসিঙ্ক অ্যাকশন থাকে তবে এর মতো কিছু:

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

FindByIdআপনার নীচের ব্যবহারের নীচের বিবরণটি প্রয়োজন যাতে অ-অ্যাসিঙ্ক UserManagerপদ্ধতিগুলি পাওয়া যায় (এগুলি ইউজারম্যানেজারের জন্য এক্সটেনশন পদ্ধতি , তাই আপনি যদি এটি অন্তর্ভুক্ত না করেন তবে আপনি কেবল দেখতে পাবেন 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; }

কন্ট্রোলার কনস্ট্রাক্টারে এটি যুক্ত করুন:

    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());

সংযোজন:

রিমোট ডেটাবেস সংযোগের মাধ্যমে অ্যাজুরের সাথে ইএফ এবং পরিচয় ফ্রেমওয়ার্ক ব্যবহার করার সময় (যেমন অ্যাজুর ডাটাবেসের স্থানীয় হোস্ট টেস্টিং) আপনি এলোমেলোভাবে ভয়ঙ্কর আঘাত করতে পারেন "ত্রুটি: 19 - শারীরিক সংযোগ ব্যবহারযোগ্য নয়"। কারণ পরিচয় ফ্রেমওয়ার্কের ভিতরে কারণটি সমাহিত করা হয়েছে, যেখানে আপনি পুনরায় চেষ্টা যোগ করতে পারবেন না (বা যা অনুপস্থিত বলে মনে হচ্ছে .Include(x->someTable)) তাই আপনাকে SqlAzureExecutionStrategyআপনার প্রকল্পে একটি কাস্টম প্রয়োগ করতে হবে ।


5
@ টিবিএ - ধন্যবাদ, আমি পরে বুঝতে পারি এটি একটি এক্সটেনশন পদ্ধতি। মাইক্রোসফ্ট.এস্পনেট.আইডেন্টিটি যুক্ত করা দরকার। আবার ধন্যবাদ
সেন্টিনেল

2
টাইপ করুন অথবা namesapce UserStore হতে পারে না found.I Microsft.AspNet.Indentity ব্যবহার যোগ
Wasfa

2
@ জাপনোলজিকা: এটি একটি নতুন প্রশ্নের মতো মনে হচ্ছে (আপনি এটি পোস্ট করার পরামর্শ দিচ্ছেন)। আপনি ApplicationUserক্লাস (অ্যাপ্লিকেশন নির্দিষ্ট) এবং AspNetUsersটেবিলকে সমান্তরালে প্রসারিত করতে পারেন এবং তারা যে কোনও নতুন ক্ষেত্র সরবরাহ করবে। আবার: সরাসরি ডাটাবেস মারবেন না! :)
কোডিং হয়ে গেছে

2
@ লাইফএইচ 2 ও: ফাইন্ডবাইআইডি দ্বারা ফিরিয়ে নেওয়া অ্যাপ্লিকেশন ব্যবহারকারীটি আপনার অতিরিক্ত বৈশিষ্ট্য সহ সম্পূর্ণ, আপনার ক্লাস । এটি চেষ্টা করুন।
কোডিং চলে গেছে

1
আপনার নতুন কাজের জন্য অপেক্ষা: পি
অনুপ শর্মা

60

আমার ভুল, আমার একটি লিনকিউ কোয়েরিতে কোনও পদ্ধতি ব্যবহার করা উচিত হয়নি।

সঠিক কোড:

using Microsoft.AspNet.Identity;


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

2
User.Identiy.GetUserId আমার জন্য বিদ্যমান নেই। আমি কি কাস্টম পদ্ধতি? আমি কেবল ব্যবহারকারীর কাছে পৌঁছেছি d পরিচয়
প্রিটোরিয়াস

9
কিছুই নয় ... আপনার "মাইক্রোসফ্ট.অ্যাসপনেট.আইডেন্টিটি ব্যবহার করা দরকার"; যে পদ্ধতি সেখানে থাকার জন্য।
গেরি প্রিটোরিয়াস

4
কেবল একটি নোট, ব্যবহারকারী অবজেক্ট কেবলমাত্র নিয়ন্ত্রণকারীদের মধ্যে দৃশ্যমান।
মিরো জে

8
অবশ্যই আপনার UserManagerপদ্ধতি ব্যবহার করা উচিত এবং সরাসরি ডাটাবেসটি আঘাত করা উচিত নয়?
কোডিং হয়ে গেছে

3
@ জোশ জেলভুক: কোনও এপিআই উপলব্ধ থাকলে সরাসরি কোনও ডাটাবেস কখনও আঘাত করবেন না। এটি সূচনাকারীদের জন্য অতিরিক্ত প্রসঙ্গ থাকার একটি নতুন নির্ভরতা প্রবর্তন করে তবে ব্যবহারকারী ডাটাবেস সারণি পরিবর্তন (গত 2 বছরে 3 বার) তবে এপিআই সুসংগত।
11:48

33

এটি উত্তরের মন্তব্যে তবে এটিকে আসল সমাধান হিসাবে কেউ পোস্ট করেনি।

আপনাকে কেবল শীর্ষে একটি ব্যবহারের বিবৃতি যুক্ত করতে হবে:

using Microsoft.AspNet.Identity;

2
আমি এখানে ব্যতিক্রম নিয়ে এখানে এসেছি, আমি এটি দিয়ে এটি সমাধান করেছি using। 15k লোক হিসাবে দেখা প্রশ্নটি দেখেছি যে আমি বুঝতে পেরেছিলাম এটি একটি সহায়ক উত্তর ছিল :)
rtpHarry

2
@ ট্রু ব্লুউসি, ওপিএস প্রশ্নের সরাসরি উত্তর না থাকা সত্ত্বেও, আমি মনে করি যে এটির ব্যবহারটি উল্লেখ করা একটি খুব দরকারী সংযোজন।
স্টুয়ার্টকিউ

1
স্পষ্টতার জন্য, এটি কারণ .GetUserId()একটি এক্সটেনশন পদ্ধতি
এফএসসিকুর

11

এলবার কোডটি কাজ করে! আপনার শুধুমাত্র ব্যবহার করে যুক্ত করা দরকার।

1 - using Microsoft.AspNet.Identity;

এবং ... ইলবারের কোড:

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

এই কোড (ইন currentUser) দিয়ে আপনি সংযুক্ত ব্যবহারকারীর সাধারণ তথ্য ব্যবহার করেন, যদি আপনি অতিরিক্ত ডেটা চান ... এই লিঙ্কটি দেখুন


5
এটি "কাজ" করতে পারে তবে সরবরাহকৃত এআইপি বাইপাস করে সরাসরি ডাটাবেস হিট করার পরামর্শ দেওয়া হয় না আপনি যদি API ব্যবহার করেন তবে অতিরিক্ত ডেটা পাওয়ার জন্য আপনার অতিরিক্ত কাজের প্রয়োজন পড়বে না কারণ এটি ইতিমধ্যে ApplicationUserঅবজেক্টে থাকবে
গন কোডিং

আমি রাজী! যাইহোক, এইভাবে অবলম্বন করলেন কারণ আমার কাছে ইতিমধ্যে আজ একটি ব্যবস্থা ছিল, ডাটাবেসে একটি রান ছিল এবং এই সমস্যাটি সমাধান করার জন্য আমার একটি সহজ সমাধান প্রয়োজন! অবশ্যই, একটি প্রাথমিক সিস্টেমে, আমি তাদের যথাযথ শ্রেণী এবং পরিচয়গুলিতে বস্তুগুলি রাখতাম।
দিয়েগো বোর্জেস

6

এএসপি.এনইটি পরিচয় 3.0.০.০ হিসাবে, এটি পুনরুদ্ধার করা হয়েছে

//returns the userid claim value if present, otherwise returns null
User.GetUserId();

6
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;

3

এমভিসি 5 এর জন্য কেবল ওয়েব অ্যাপ্লিকেশন টেম্পলেট স্ক্যাফোলে ম্যানেজডকন্ট্রোলারের সক্ষমযোগ্য টুএফ্যাক্টর প্রমাণীকরণ পদ্ধতির ভিতরে দেখুন, এটি এখানে সম্পন্ন হচ্ছে:

        [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());

এতে আপনি অ্যাপ্লিকেশন ব্যবহারকারী শ্রেণিতে সংজ্ঞায়িত সমস্ত অতিরিক্ত সম্পত্তি থাকবে।


5
ইতিমধ্যে আচ্ছাদিত। দয়া করে পরীক্ষা করুন যে একটি অভিন্ন উত্তর ইতিমধ্যে পোস্ট করা হয়নি (বা বিদ্যমান উত্তরে একটি মন্তব্য যুক্ত করুন) :)
কোডিং হয়েছে

3

এই মুহূর্তে asp.mvc প্রকল্প টেমপ্লেট একটি অ্যাকাউন্ট নিয়ামক তৈরি করে যা এইভাবে ব্যবহারকারীর ব্যবস্থা করে:

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

নিম্নলিখিতটি আমার পক্ষে কাজ করে:

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

0

আমি কোডটি অনুসরণ করে অ্যাপ্লিকেশন ব্যবহারকারীকে সাফল্যের সাথে উপলব্ধ ছিল

var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            var user = manager.FindById(User.Identity.GetUserId());
            ApplicationUser EmpUser = user;

0

যদি কেউ Identityব্যবহারকারীদের সাথে web formsকাজ করে থাকে তবে আমি এটি করে এটি কাজ করেছিলাম:

var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var user = manager.FindById(User.Identity.GetUserId());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.