ASP.NET आइडेंटिटी में रोल्स बनाम क्लेम के लिए बेस्ट प्रैक्टिस


94

मैं पूरी तरह से का उपयोग करने के नया हूँ 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();
}

1
तो, मैं अब उसी मुद्दे का सामना कर रहा हूं, आप इसे कैसे हल करते हैं और आप आवेदन में अनुमति को कैसे हटा सकते हैं?
Loai

जवाबों:


77

एक भूमिका एक प्रतीकात्मक श्रेणी है जो उपयोगकर्ताओं को एक साथ इकट्ठा करती है जो समान सुरक्षा विशेषाधिकारों को साझा करते हैं। भूमिका-आधारित प्राधिकरण को पहले उपयोगकर्ता की पहचान करने की आवश्यकता होती है, फिर उन भूमिकाओं का पता लगाना होता है, जिन्हें उपयोगकर्ता को सौंपा गया है, और अंत में उन भूमिकाओं की तुलना उन भूमिकाओं से की जाती है जो किसी संसाधन तक पहुँचने के लिए अधिकृत हैं।

इसके विपरीत, एक दावा समूह आधारित नहीं है, बल्कि यह पहचान आधारित है।

से माइक्रोसॉफ्ट प्रलेखन :

जब कोई पहचान बनाई जाती है तो उसे एक विश्वसनीय पार्टी द्वारा जारी किए गए एक या अधिक दावों के लिए सौंपा जा सकता है। एक दावा एक नाम मान युग्म है जो विषय का प्रतिनिधित्व करता है, न कि विषय क्या कर सकता है।

एक सुरक्षा जांच बाद में एक या अधिक दावों के मूल्य के आधार पर संसाधन तक पहुंचने के अधिकार का निर्धारण कर सकती है।

आप कॉन्सर्ट में दोनों का उपयोग कर सकते हैं, या कुछ स्थितियों में एक प्रकार का उपयोग कर सकते हैं और दूसरे में अन्य स्थितियों में। यह ज्यादातर अन्य प्रणालियों और आपकी प्रबंधन रणनीति के साथ अंतर-संचालन पर निर्भर करता है। उदाहरण के लिए, एक प्रबंधक के लिए एक भूमिका के लिए सौंपे गए उपयोगकर्ताओं की सूची को प्रबंधित करना आसान हो सकता है, जो यह निर्दिष्ट करना है कि किसने एक विशिष्ट दावा सौंपा है। दावे एक उपयोगी परिदृश्य में बहुत उपयोगी हो सकते हैं जहाँ आप एक ग्राहक को दावा सौंप सकते हैं, और ग्राहक तब हर अनुरोध के लिए उपयोगकर्ता नाम और पासवर्ड पारित करने के बजाय प्राधिकरण के लिए दावा पेश कर सकता है।


6
मेरा मानना ​​है कि यह पूरी तरह से सही नहीं है। मेरा मानना ​​है कि दावे पहचान को इंगित करते हैं, प्राधिकरण को नहीं। वे जो करने के लिए अधिकृत हैं, उन्हें अलग से प्रबंधित किया जाता है। यही है, उनके पास एक दावा हो सकता है कि उनकी जन्मतिथि यह दर्शाती है कि वे 18 वर्ष से अधिक हैं। यह दावा एक प्राधिकरण प्रबंधक को दिया जाएगा जिसमें एक नियम हो सकता है जो कहता है कि "यदि वे 18 वर्ष से अधिक हैं, तो वे संसाधन X को संपादित कर सकते हैं", लेकिन दावा स्वयं यह नहीं दर्शाता है कि वे क्या कर सकते हैं / नहीं कर सकते हैं या पहुंच नहीं सकते हैं। वही भूमिका और अन्य दावों के लिए जाता है। दावों से संकेत मिलता है कि आप कौन हैं, और यह निर्धारित करने के लिए उपयोग किया जाता है कि आप क्या कर सकते हैं, लेकिन वे आपको सीधे नहीं बताते हैं
क्रिस जूल

@ChrisC के लिए दस्तावेज़ीकरण का समर्थन ASP.NET कोर में Microsoft के दावे-आधारित प्राधिकरण से है : "एक दावा एक नाम मान युग्म है जो विषय का प्रतिनिधित्व करता है, न कि विषय क्या कर सकता है।"
DrGriff

@DrGriff उस लिंक को प्रदान करने के लिए धन्यवाद; मेरे द्वारा दिए गए विवरण की सटीकता के बारे में मैं थोड़ी देर के लिए पूछताछ कर रहा था; मुझे लगता है कि मैंने अब उस लिंक के आधार पर उत्तर स्पष्ट कर दिया है।
क्लेम

29

जैसा कि @ कैलीज ने पूरी तरह से समझाया, दावे एक अधिक वर्णनात्मक हो सकते हैं और एक गहरी तरह की भूमिका है। मैं आपके बारे में सोचता हूं कि आपकी भूमिकाएं आईडी हैं। मेरे पास जिम आईडी है, इसलिए मैं सदस्यों की भूमिका में हूं। मैं किकबॉक्सिंग के पाठ में भी हूं, इसलिए मेरे पास उनके लिए किकबॉक्सिंग आईडी का दावा है। मेरे आवेदन को मेरी सदस्यता के अधिकार के लिए एक नई भूमिका की घोषणा की आवश्यकता होगी। इसके बजाय, मेरे पास प्रत्येक समूह वर्ग के लिए आईडी हैं जो कि मैं हूं, बहुत सारे नए सदस्यता प्रकारों के बजाय। यही वजह है कि दावे मेरे लिए बेहतर हैं।

बैरी डोरेंस का एक बहुत अच्छा स्पष्टीकरण वीडियो है, जो भूमिकाओं पर दावों का उपयोग करने के लाभ के बारे में बात कर रहा है। उन्होंने यह भी कहा कि पिछड़े अनुकूलता के लिए भूमिकाएँ अभी भी .NET में हैं। दावा, भूमिका, नीतियों, प्राधिकरण और प्रमाणीकरण कार्यों के तरीके के बारे में वीडियो बहुत जानकारीपूर्ण है।

आप इसे यहां पा सकते हैं: ASP.NET Core Barr Dorrans के साथ प्राधिकरण


8

दशकों से विभिन्न प्रमाणीकरण और प्राधिकरण तकनीकों का उपयोग करने के बाद, मेरा वर्तमान एमवीसी एप्लिकेशन निम्न पद्धति का उपयोग करता है।

सभी प्राधिकरणों के लिए दावों का उपयोग किया जाता है। उपयोगकर्ताओं को एक भूमिका सौंपी जाती है (कई भूमिकाएं संभव हैं लेकिन मुझे इसकी आवश्यकता नहीं है) - नीचे और अधिक।

जैसा कि आम है, A ClaimsAuthorize विशेषता वर्ग का उपयोग किया जाता है। चूंकि अधिकांश नियंत्रक क्रियाएं CRUD हैं, इसलिए मुझे कोड-पहली डेटाबेस पीढ़ी में एक दिनचर्या मिलती है जो सभी नियंत्रक क्रियाओं को पुनरावृत्त करती है और प्रत्येक कंट्रोलर एक्शन विशेषता के रीड / एडिट / क्रिएट / डिलीट के लिए दावा प्रकार बनाती है। जैसे,

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

MVC व्यू में उपयोग के लिए, एक बेस कंट्रोलर क्लास व्यू बैग आइटम प्रस्तुत करता है

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

वेबसाइट मेनू और अन्य गैर-नियंत्रक कार्यों के लिए, मेरे पास अन्य दावे हैं। उदाहरण के लिए, क्या कोई उपयोगकर्ता किसी विशेष मौद्रिक क्षेत्र को देख सकता है।

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");
    }
}

तो रोल्स कहाँ में फिट होते हैं?

मेरे पास एक तालिका है जो दावों के लिए एक भूमिका (डिफ़ॉल्ट) सेट को लिंक करती है। उपयोगकर्ता प्राधिकरण सेट करते समय, डिफ़ॉल्ट उपयोगकर्ता को उनकी भूमिका के दावे देने के लिए है। प्रत्येक उपयोगकर्ता के डिफ़ॉल्ट से अधिक या कम दावे हो सकते हैं। संपादन सरल बनाने के लिए, दावों की सूची नियंत्रक और कार्यों (एक पंक्ति में) द्वारा दर्शाई जाती है, अन्य दावों के साथ फिर सूचीबद्ध की जाती है। बटनों का उपयोग दावों का चयन करने के लिए आवश्यक "क्लिक" को कम करने के लिए कार्रवाई के एक सेट का चयन करने के लिए जावास्क्रिप्ट के एक बिट के साथ किया जाता है। सहेजें पर, उपयोगकर्ता के दावे हटा दिए जाते हैं और सभी चयनित दावे जोड़ दिए जाते हैं। वेब एप्लिकेशन लोड केवल एक बार दावा करता है, इसलिए इस स्थिर डेटा के भीतर किसी भी परिवर्तन को पुनः लोड करना होगा।

प्रबंधक इसलिए यह दावा कर सकते हैं कि प्रत्येक भूमिका में कौन से दावे हैं और कौन सा दावा है कि एक उपयोगकर्ता ने उन्हें एक भूमिका के लिए निर्धारित किया है और उन डिफ़ॉल्ट दावों को। सिस्टम में केवल कुछ ही उपयोगकर्ता हैं इसलिए इस डेटा को प्रबंधित करना सीधा है


3

भूमिका और दावों के बीच अंतर को समझने के लिए, आपको भूमिकाओं की सीमा का सामना करना पड़ता है और महसूस करना है कि इस मुद्दे पर दावे कैसे आते हैं, इसलिए मुझे जलाया आपने दावों की शक्ति को पहचानने के लिए 2 परिदृश्य दिए जहां भूमिका इस मुद्दों को हल नहीं कर सकती है:

1- आपकी साइट के दो मॉड्यूल (पृष्ठ, सेवा ..etc) में पहला मॉड्यूल फ्रंट चाइल्ड (18 वर्ष से कम) वयस्क के लिए दूसरा (18 वर्ष से अधिक) आपकी उपयोगकर्ता पहचान का जन्मदिन का दावा है

आपको इस दावे पर नीति बनाने की आवश्यकता है इसलिए प्रत्येक मॉड्यूल के लिए प्राधिकरण को इस मूल्य पर दिया जाएगा और यदि उपयोगकर्ता की आयु 18 वर्ष से अधिक है तो वह वयस्क मॉड्यूल में जा सकता है और इस आयु से पहले नहीं

भूमिका बूलियन डेटा प्रकार है जिसमें आपके पास भूमिका हो सकती है या नहीं भूमिका भूमिका में खराब मूल्य नहीं थे

2- आपकी साइट में उपयोगकर्ता की भूमिका है और आप कोड को बदले बिना कुछ रखरखाव करने के लिए उपयोगकर्ताओं की पहुंच को रोकने के लिए नहीं चाहते हैं

दावों में आप अंडरकॉस्ट्रेन पॉलिसी बना सकते हैं कि अगर सच्चा उपयोगकर्ता उस पेज को नहीं देख सकता है जो रोल यूजर के लिए संपत्ति को अधिकृत करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.