আমার বলতে হবে যে আমি বেশ অবাক হয়েছিলাম যে এইচটিটিপি কনট্রাক্টরের অভ্যন্তরে নাল। আমি নিশ্চিত এটি পারফরম্যান্সের কারণেই। নিশ্চিত করেছেন যে IPrincipalনীচে বর্ণিত হিসাবে এটি ব্যবহার করে এটি কনস্ট্রাক্টরে ইনজেকশনের ব্যবস্থা করে। এটি মূলত গৃহীত উত্তরের মতো একই কাজ করছে তবে আরও ইন্টারফেসিও পদ্ধতিতে।
এই প্রশ্নের সন্ধানকারী যে কেউ জেনেরিকের উত্তর খুঁজছেন "বর্তমান ব্যবহারকারী কীভাবে পাবেন?" আপনি কেবল Userএখান থেকে সরাসরি অ্যাক্সেস করতে পারেন Controller.User। তবে আপনি কেবল এটি অ্যাকশন পদ্ধতির অভ্যন্তরেই করতে পারেন (আমি ধরে নিই কারণ নিয়ামকরা কেবল এইচটিপিপেক্সটেক্সট এবং পারফরম্যান্সের কারণে চালায় না)।
তবে - যদি আপনার কনস্ট্রাক্টরে এটির প্রয়োজন হয় (যেমন ওপি করেছেন) বা অন্য ইনজেক্টেবল অবজেক্ট তৈরি করতে প্রয়োজন যা বর্তমান ব্যবহারকারীর প্রয়োজন তখন নীচে একটি আরও ভাল পদ্ধতির উপায়:
ব্যবহারকারী পেতে আইপিআরসিস্ট্যানাল ইনজেক্ট
প্রথম দেখা IPrincipalএবংIIdentity
public interface IPrincipal
{
IIdentity Identity { get; }
bool IsInRole(string role);
}
public interface IIdentity
{
string AuthenticationType { get; }
bool IsAuthenticated { get; }
string Name { get; }
}
IPrincipalএবং IIdentityব্যবহারকারী এবং ব্যবহারকারীর নাম উপস্থাপন করে। 'প্রিন্সিপাল' বিজোড় লাগলে উইকিপিডিয়া আপনাকে সান্ত্বনা দেবে ।
আপনি এটি পেয়েছেন কিনা তা আপনি উপলব্ধি করা গুরুত্বপূর্ণ IHttpContextAccessor.HttpContext.User, ControllerBase.Userবা ControllerBase.HttpContext.Userআপনি এমন একটি বস্তু পেয়ে ClaimsPrincipalযা যা বাস্তবায়ন করে এমন একটি বস্তুর গ্যারান্টিযুক্তIPrincipal ।
এএসপি.এনইটি এই মুহূর্তে ব্যবহার করে এমন কোনও অন্য ধরণের ব্যবহারকারীর Userনেই, (তবে এটি অন্য কোনও কিছু প্রয়োগ করতে পারেনি তা বলার অপেক্ষা রাখে না IPrincipal)।
সুতরাং আপনার যদি এমন কিছু থাকে যা 'বর্তমান ব্যবহারকারীর নাম' এর উপর নির্ভরশীলতা রয়েছে যা আপনি ইনজেকশন চান তা আপনার ইনজেকশন করা উচিত IPrincipalএবং অবশ্যই হওয়া উচিত নয় IHttpContextAccessor।
গুরুত্বপূর্ণ:IPrincipal সরাসরি আপনার নিয়ামক বা ক্রিয়া পদ্ধতিতে ইনজেকশন দেওয়ার সময় নষ্ট করবেন না - এটি Userইতিমধ্যে সেখানে আপনার জন্য উপলব্ধ যেহেতু এটি অর্থহীন ।
ইন startup.cs:
// Inject IPrincipal
services.AddTransient<IPrincipal>(provider => provider.GetService<IHttpContextAccessor>().HttpContext.User);
তারপরে আপনার ডিআই অবজেক্টে যার প্রয়োজন ব্যবহারকারীকে আপনি কেবলমাত্র IPrincipalবর্তমান ব্যবহারকারী পেতে ইনজেক্ট করেন।
এখানে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি হল আপনি যদি ইউনিট পরীক্ষা করে থাকেন তবে আপনাকে কোনও পাঠানোর দরকার নেই HttpContext, তবে কেবল এমন কিছু উপহাস করা উচিত যা প্রতিনিধিত্ব করে IPrincipal যা কেবল হতে পারে ClaimsPrincipal ।
একটি অতিরিক্ত গুরুত্বপূর্ণ বিষয় যা সম্পর্কে আমি 100% নিশ্চিত নই। আপনার যদি আসল দাবিগুলি অ্যাক্সেস করতে হয় তবে ClaimsPrincipalআপনার কাছে কাস্ট IPrincipalকরতে হবে ClaimsPrincipal। এটি ঠিক আছে যেহেতু আমরা জানি 100% যে রানটাইম সময়ে এটি টাইপের হয় (যেহেতু এটি HttpContext.Userতাই)। আমি আসলে কনস্ট্রাক্টরে এটি করতে পছন্দ করি যেহেতু আমি ইতিমধ্যে জানি যে কোনও IPrincipal একটি হবে ClaimsPrincipal।
আপনি যদি উপহাস করছেন, কেবল একটি ClaimsPrincipalসরাসরি তৈরি করুন এবং যা যা লাগে তা এটিকে দিন IPrincipal।
কেন ঠিক কোন ইন্টারফেসের জন্য IClaimsPrincipalআমি নিশ্চিত নই। আমি ধরে নিলাম এমএস সিদ্ধান্ত নিয়েছে যে ClaimsPrincipalএটি কেবলমাত্র একটি বিশেষ 'সংগ্রহ' যা কোনও ইন্টারফেসের ওয়ারেন্ট দেয় না।