ASP.NET সনাক্তকরণে ভূমিকা বনাম দাবিগুলির জন্য সেরা অনুশীলন


98

আমি claimsইন ব্যবহারে সম্পূর্ণ নতুন এবং ব্যবহারের ASP.NETIdentityক্ষেত্রে সর্বোত্তম অনুশীলনের ধারণা পেতে চাই Roles and/or Claims

এই সমস্ত পাঠের পরেও আমার এখনও এমন প্রশ্ন রয়েছে ...

প্রশ্ন: আমরা কি আর ভূমিকা ব্যবহার করি না?
প্রশ্ন: যদি তাই হয় তবে এখনও কেন ভূমিকাগুলি দেওয়া হয়?
প্রশ্ন: আমাদের কি কেবল দাবি ব্যবহার করা উচিত?
প্রশ্ন: আমাদের ভূমিকা এবং দাবি একসাথে ব্যবহার করা উচিত?

আমার প্রাথমিক চিন্তাটি হ'ল আমাদের এগুলি একসাথে ব্যবহার করা উচিত। আমি তাদের সমর্থন Claimsকরে এমন উপ-বিভাগ হিসাবে দেখছি Roles

উদাহরণ হিসাবে:
ভূমিকা: অ্যাকাউন্টিং
দাবি : CanUpdateLedger, CanOnlyReadLedger, CanDeleteFromLedger

প্রশ্ন: তারা পারস্পরিক একচেটিয়া হওয়ার উদ্দেশ্যে?
প্রশ্ন: অথবা কেবলমাত্র দাবিগুলি করা এবং আপনার দাবিতে "সম্পূর্ণ-যোগ্যতা অর্জন করা" ভাল?
প্রশ্ন: তাহলে এখানে সেরা অনুশীলনগুলি কী কী?

উদাহরণ: ভূমিকা এবং দাবি একসাথে ব্যবহার করা
অবশ্যই, এর জন্য আপনাকে নিজের নিজস্ব অ্যাট্রিবিউট যুক্তি লিখতে হবে ...

[Authorize(Roles="Accounting")]
[ClaimAuthorize(Permission="CanUpdateLedger")]
public ActionResult CreateAsset(Asset entity)
{
    // Do stuff here

    return View();
}

উদাহরণ: আপনার দাবিকে পুরোপুরি যোগ্য করে তোলা

[ClaimAuthorize(Permission="Accounting.Ledger.CanUpdate")]
public ActionResult CreateAsset(Asset entity)
{
    // Do stuff here

    return View();
}

4
সুতরাং, আমি এখন একই সমস্যার মুখোমুখি, আপনি কীভাবে এটি সমাধান করবেন এবং আপনি কীভাবে অ্যাপ্লিকেশনটিতে অনুমতিটি সাব্রোল করতে পারবেন?
লোই

উত্তর:


78

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

বিপরীতে, একটি দাবি গোষ্ঠীভিত্তিক নয়, বরং এটি পরিচয় ভিত্তিক।

মাইক্রোসফ্ট ডকুমেন্টেশন থেকে :

যখন কোনও পরিচয় তৈরি করা হয় তখন এটি কোনও বিশ্বস্ত পক্ষ দ্বারা জারি করা এক বা একাধিক দাবি অর্পণ করা হতে পারে। দাবি হ'ল একটি নাম মান জুটি যা বিষয়টি কী তা প্রতিনিধিত্ব করে, বিষয় কী করতে পারে তা নয়।

একটি সুরক্ষা চেক পরে এক বা একাধিক দাবির মানের ভিত্তিতে কোনও সংস্থান অ্যাক্সেসের অধিকার নির্ধারণ করতে পারে।

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


7
আমি বিশ্বাস করি না এটি পুরোপুরি সঠিক is আমি বিশ্বাস করি দাবিগুলি অনুমোদন নয়, পরিচয় নির্দেশ করে। তারা যা করার জন্য অনুমোদিত তা আলাদাভাবে পরিচালিত হয়। অর্থাৎ, তাদের একটি দাবি থাকতে পারে যা তাদের জন্মের তারিখটি নির্দেশ করে যে তাদের বয়স ১৮ বছরের বেশি। তবে দাবি নিজেই কী করতে পারে বা করতে পারে বা অ্যাক্সেস করতে পারে তা নির্দেশ করে না। একই ভূমিকা এবং অন্যান্য দাবির জন্য যায়। দাবিগুলি আপনি কে এবং আপনি কী করতে পারবেন তা নির্ধারণ করতে ব্যবহৃত হয় তবে তারা আপনাকে সরাসরি বলে না
ChrisC

@Crisc এর পক্ষে সমর্থনকারী ডকুমেন্টেশনগুলি এএসপি.নেট কোর মাইক্রোসফ্টের দাবি-ভিত্তিক অনুমোদনের থেকে : "দাবিটি একটি নাম মান জুটি যা বিষয়টি কী তা উপস্থাপন করে, বিষয়টি কী করতে পারে তা নয়।"
ডাঃগ্রিফ

@ ডিগ্রিফ এই লিঙ্কটি সরবরাহ করার জন্য আপনাকে ধন্যবাদ; আমি যে বিবরণ দিয়েছিলাম তার যথার্থতা সম্পর্কে আমি কিছুক্ষণ জিজ্ঞাসা করছিলাম; আমি মনে করি আমি এখন সেই লিঙ্কটির ভিত্তিতে উত্তরটি পরিষ্কার করে দিয়েছি।
11:50:50

31

@ ক্লেইস যেমন নিখুঁতভাবে ব্যাখ্যা করেছে, দাবিগুলি আরও বর্ণনামূলক হতে পারে এবং এটি গভীর ধরণের ভূমিকা। আমি তাদের সম্পর্কে আপনার ভূমিকা ID হিসাবে মনে করি। আমার একটি জিম আইডি আছে, তাই আমি সদস্যদের ভূমিকার অন্তর্ভুক্ত। আমি কিকবক্সিং পাঠেও রয়েছি, সুতরাং তাদের জন্য আমার একটি কিকবক্সিং আইডি দাবি রয়েছে। আমার সদস্যপদ অধিকারের জন্য আমার আবেদনের নতুন ভূমিকা ঘোষণার প্রয়োজন হবে। পরিবর্তে, প্রচুর নতুন সদস্যতার ধরণের পরিবর্তে আমার প্রতিটি গ্রুপ বর্গের জন্য আইডিস রয়েছে। এজন্য আমার পক্ষে দাবি আরও ভাল ফিট করে।

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

আপনি এটি এখানে খুঁজে পেতে পারেন: বার ডরান্স সহ এএসপি.এনইটি কোর অনুমোদন Author


8

কয়েক দশক ধরে বিভিন্ন প্রমাণীকরণ এবং অনুমোদনের কৌশল ব্যবহার করে, আমার বর্তমান এমভিসি অ্যাপ্লিকেশনটি নিম্নলিখিত পদ্ধতিটি ব্যবহার করে।

দাবিগুলি সমস্ত অনুমোদনের জন্য ব্যবহৃত হয়। ব্যবহারকারীদের একটি ভূমিকা নিযুক্ত করা হয়েছে (একাধিক ভূমিকা সম্ভব তবে আমার এটির দরকার নেই) - আরও নীচে।

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

[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]

এমভিসি ভিউতে ব্যবহারের জন্য, একটি বেস নিয়ামক শ্রেণি ব্যাগ আইটেমগুলি উপস্থাপন করে

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // get user claims
            var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;

            if (user != null)
            {
                // Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
                List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();

                // set Viewbag with default authorisations on this controller
                ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
                ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
                ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
                ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
            }

            base.OnActionExecuting(filterContext);
        }

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

bool UserHasSpecificClaim(string claimType, string claimValue)
{
    // get user claims
    var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;

    if (user != null)
    {
        // Get the specific claim if any
        return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
    }

    return false;
}

public bool UserHasTradePricesReadClaim
{
    get
    {
        return UserHasSpecificClaim("TradePrices", "Read");
    }
}

তাহলে ভূমিকা কোথায় ফিট করে?

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

পরিচালকরা তাই প্রতিটি ভূমিকাতে কোন দাবি রয়েছে এবং কোন ভূমিকা এবং সেগুলি পূর্বনির্ধারিত দাবিগুলিতে সেট করার পরে কোনও ব্যবহারকারীকে কী দাবি করে তা চয়ন করতে পারেন। সিস্টেমে খুব কম ব্যবহারকারী রয়েছেন তাই এই ডেটা পরিচালনা করা সোজা


4

ভূমিকা এবং দাবির মধ্যে পার্থক্য বোঝার জন্য আপনি ভূমিকার সীমাবদ্ধতার মুখোমুখি হন এবং এই সমস্যাগুলির উপর কীভাবে দাবি আসে তা অনুভব করতে, তাই আমি আপনাকে 2 টি দাবির শক্তি স্বীকৃতি দেওয়ার মতো পরিস্থিতি দিয়েছি যেখানে ভূমিকা এই সমস্যাগুলি সমাধান করতে পারে না:

1- আপনার সাইটে দুটি মডিউল থাকতে হবে (পৃষ্ঠাগুলি, পরিষেবা .. ইত্যাদি) প্রথম মডিউল সামনের শিশু (18 বছরের কম বয়সী) অন্যটি প্রাপ্তবয়স্কদের জন্য (18 বছরের বেশি বয়সী) আপনার ব্যবহারকারীর পরিচয়ের জন্মদিনের দাবি রয়েছে

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

ভূমিকা হ'ল বুলিয়ান ডেটা টাইপ আপনার ভূমিকা ভূমিকা থাকতে পারে বা নাও থাকতে পারে না যা ম্যাল্টি মান হয় না

2- আপনার সাইটের ভূমিকা ব্যবহারকারী এবং আপনি কোড পরিবর্তন না করে কিছু রক্ষণাবেক্ষণ করতে ব্যবহারকারীদের অ্যাক্সেস আটকাতে চান না

দাবীতে আপনি আন্ডার কনস্ট্রেন নীতি তৈরি করতে পারেন যে সত্য ব্যবহারকারী যদি পৃষ্ঠাটি দেখতে না পান তবে সম্পত্তি ব্যবহারকারীর জন্য অনুমোদিত করতে পারেন।

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