প্যারামিটার হিসাবে ইউজারআইডি পাস না করেই, এপিআইকন্ট্রোলার অ্যাকশনের মধ্যে বর্তমান ব্যবহারকারী পান


97

ইউজারনেম বা ইউজারআইডি প্যারামিটার হিসাবে পাস না করে আমরা কীভাবে সুরক্ষিত এপিআইকন্ট্রোলার অ্যাকশনের মধ্যে বর্তমান ব্যবহারকারীকে পেতে পারি?

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


দয়া করে, এই উত্তরটি দেখুন: stackoverflow.com/a/26453782/3290276 দাবীটি কৌশলটি করেছে
গ্যাব্রিয়েলা ম্যাকিয়াস

উত্তর:


149

WebApi 2 এ আপনি ApiController এ RequestContext.Principalকোনও পদ্ধতির মধ্যে থেকে ব্যবহার করতে পারেন


4
আমাদের কাছে সেই সম্পত্তি নেই, মনে হয়। হুঁ। হতে পারে আমরা ওয়েবএপিপি-র একটি পুরানো সংস্করণ ব্যবহার করছি।
শান লুটিন

4
@ শনলুটিন ঠিক আছে, সুতরাং আপনি যদি ওয়েব এপিআই 1 ব্যবহার করছেন তবে আপনি বিশ্বাস করি এপি কন্ট্রোলারের একটি প্রিনিকপাল সম্পত্তি রয়েছে। অনুরোধ.প্রাপ্তি সংগ্রহের অ্যাক্সেসের চারপাশে এটি কেবল অভিনব র‍্যাপার। মূল শব্দটি সেই অভিধানে সংরক্ষণ করা হয়।
ড্যারেল মিলার

6
শুধু ভুলে যাবেন নাusing Microsoft.AspNet.Identity;
ওভারলর্ড

4
@ ড্যারেল মিলার কোডের অন্যান্য অংশগুলি (নিয়ন্ত্রকের মধ্যে নয়) থেকে একই (অনুরোধের প্রসঙ্গে বলুন) পাওয়ার উপায় আছে।
অজয় আরাধ্য্যা

4
@ অজয় ​​আরাধ্য্যা কেবল যদি আপনি সেখানে পাস করেন তবেই। ওয়েব ফ্রেমওয়ার্কগুলিতে পূর্ববর্তী প্রচেষ্টাগুলি প্রমাণ করেছে যে অনুরোধ প্রসঙ্গে অ্যাক্সেস করতে অচলিত বৈশিষ্ট্যগুলি ব্যবহার করা সমস্ত ধরণের আর্কিটেকচারাল সমস্যার কারণ হয়ে থাকে। এটি প্রথমে সুবিধাজনক তবে এটি দীর্ঘ সময়ের জন্য খুব বেশি ব্যথা করে।
ড্যারেল মিলার

36

আপনি Userসম্পত্তিটি ব্যবহার করে অধ্যক্ষকেও অ্যাক্সেস করতে পারেন ApiController

সুতরাং নিম্নলিখিত দুটি বিবৃতি মূলত একই:

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();

15
আপনি এখানে যা লিখেছেন তা আমি ব্যবহার করার চেষ্টা করছি তবে GetUserId () ফাংশনটি সর্বদা বাতিল হয়ে যায় returns ব্যবহারকারীর লেখক, আমি একটি বাহক টোকন পাস করছি, এবং এপিআইকন্ট্রোলারের [অনুমোদিত] শিরোনাম রয়েছে
জোশুয়া ওহানা

গেট ইউজারআইডি () ফাংশনটি কেবলমাত্র আইডি ফিরিয়ে দেয় যদি ব্যবহারকারীর নাম-আইডেন্টিফায়ার দাবি থাকে। : এই কিভাবে সমাধান করতে একজন উদাহরণস্বরূপ, Oswaldo এর উত্তর এখানে পড়ুন stackoverflow.com/questions/19505526
jramm

14

ইঙ্গিতটি Webapi2 অটো উত্পাদিত অ্যাকাউন্ট নিয়ামকের মধ্যে থাকে

গেটার হিসাবে এই সম্পত্তি হিসাবে সংজ্ঞায়িত করা আছে

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

এবং ব্যবহারকারীর ব্যবস্থাপনার জন্য - রোমান হিসাবে ওয়েবএপিপি 2-তে (অ্যাকাউন্টকন্ট্রোলার হিসাবে পড়ুন) করুন

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

এটি আইআইএস এবং স্ব হোস্ট মোডে সামঞ্জস্যপূর্ণ হওয়া উচিত


7

উপরের কোনও পরামর্শই আমার পক্ষে কার্যকর হয়নি। নিম্নলিখিতটি কি!

HttpContext.Current.Request.LogonUserIdentity.Name

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

কোনও ব্যবহারকারীর তথ্য পাস করার প্রয়োজন নেই। ব্রাউজার এবং আইআইএস লগইন হওয়া ব্যবহারকারী শংসাপত্রগুলিতে বিনিময় করে এবং ওয়েব এপিআইয়ের চাহিদা অনুসারে ব্যবহারকারীর শংসাপত্রগুলিতে অ্যাক্সেস থাকে (আইআইএস আমি অনুমান করি)।


6

করণ ভান্ডারীর উত্তরটি ভাল, তবে কোনও প্রকল্পে যুক্ত অ্যাকাউন্টকন্ট্রোলার খুব সম্ভবত একটি Mvc.Controller। একটি অ্যাপিকন্ট্রোলারের পরিবর্তনের জন্য তার উত্তরটি রূপান্তর HttpContext.Current.GetOwinContext()করতে Request.GetOwinContext()এবং আপনি নীচের 2 টি usingবিবৃতি যুক্ত করেছেন তা নিশ্চিত করুন :

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

5

User.Identity.Nameব্যবহারকারীর নাম দাবি পেতে নেট কোর ব্যবহার করুন।


4
User.Identity.Nameনামের দাবির মান পায় । এটি সক্রিয় ডিরেক্টরি-নির্দিষ্ট নয়।
ন্যাট বারবেটিনি

@ নাট আপনার মন্তব্যের জন্য ধন্যবাদ, আমি এটি ঠিক করেছি
ভেঙ্কটেশ মুনিয়াদি

3

আপনি যদি Asp.Identity UseManager ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে এর মান সেট করে

রিকোয়েস্টকন্টেক্সট.সত্ত্বীয়.আইডেন্টিটি.গেট ইউজারআইডি ()

আইডেন্টিটি ব্যবহারকারীর উপর ভিত্তি করে আপনি আইডেন্টিটিডিবি কনটেক্সট তৈরিতে ব্যবহার করেন ।

যদি আপনি কখনই কোনও কাস্টম ব্যবহারকারী টেবিল এবং owin টোকেন বহনকারী প্রমাণীকরণ প্রয়োগ করে থাকেন তবে দয়া করে আমার উত্তরটি দেখুন।

ওয়েব অপি কল চলাকালীন কিভাবে ব্যবহারকারী প্রসঙ্গ পাবেন?

আশা করি এটি এখনও সহায়তা করবে। :)


1
string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null 
        && HttpContext.Current.User.Identity.Name != null)
{
    userName = HttpContext.Current.User.Identity.Name;
    userId = HttpContext.Current.User.Identity.GetUserId();
}

বা ড্যারেল মিলারের মন্তব্যের ভিত্তিতে, সম্ভবত এটি প্রথম এইচটিটিপি কনটেক্সট পুনরুদ্ধার করতে ব্যবহার করুন।

// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);    

আরো দেখুন:

আপনার ওয়েব এপিআই অ্যাকশন থেকে কীভাবে HTTPContext অ্যাক্সেস করবেন to


5
এটি আপনার হোস্টিং বিকল্পগুলিকে সীমাবদ্ধ করে এবং আপনার কোডটিকে পরীক্ষা করা শক্ত করে তোলে বলে এইচটিটিপি কনটেক্সট ব্যবহার করবেন না।
ড্যারেল মিলার

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