একাধিক ভূমিকা সহ অ্যাট্রিবিউট অনুমোদিত করুন


100

আমি একবারে একাধিক ভূমিকার জন্য একটি নিয়ামককে অনুমোদন যুক্ত করতে চাই।

সাধারণত এটি দেখতে এই রকম হবে:

[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}

তবে আমি আমার ভূমিকাগুলি কনসেটগুলিতে সংরক্ষণ করেছি, যেহেতু এগুলি পরিবর্তন হতে পারে বা কোনও সময় বাড়ানো হতে পারে।

public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";

আমি এটি করতে পারি না, যেহেতু সংকলনের সময়ে স্ট্রিংটি অবশ্যই জানা উচিত:

[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}

সমস্যা থেকে বাঁচার কোন উপায় আছে কি?

আমি একটি কনস্ট লিখতে পারি যার মধ্যে কেবল "RoleA, RoleB, RoleC" থাকে - তবে আমি যাদু স্ট্রিং পছন্দ করি না এবং এটি একটি যাদু স্ট্রিং। কোনও ভূমিকার নাম পরিবর্তন করা এবং সম্মিলিত স্ট্রিং পরিবর্তন করতে ভুলে যাওয়া বিপর্যয় হবে।

আমি এমভিসি 5 ব্যবহার করছি। ASP.NET পরিচয় এবং ভূমিকা সংকলন সময়ে পরিচিত হয়।


আপনি কি সার্বজনীন কনস্ট স্ট্রিং ব্যবহার করছেন RoleA = "RoleA"; বা আপনি যেমন প্রশ্নে লিখেছেন?
মুকেশ মোধবদিয়া

উত্তর:


194

মত প্রচলিত অনুমোদন অ্যাট্রিবিউট তৈরি করার চেষ্টা এই

public class AuthorizeRolesAttribute : AuthorizeAttribute
{
    public AuthorizeRolesAttribute(params string[] roles) : base()
    {
        Roles = string.Join(",", roles);
    }
}

আপনার ভূমিকা একাধিক কন্ট্রোলারদের জন্য একই হবে বলে ধরে নেওয়া, একটি সহায়ক শ্রেণি তৈরি করুন:

public static class Role
{
    public const string Administrator = "Administrator";
    public const string Assistant = "Assistant";
}

তারপরে এটির মতো ব্যবহার করুন:

public class MyController : Controller
{
    [AuthorizeRoles(Role.Administrator, Role.Assistant)]
    public ActionResult AdminOrAssistant()
    {                       
        return View();
    }
}

12
এখন এটি ম্যাক গাইভারের যোগ্য একটি ধারণা;)
ক্রিশ্চিয়ান

4
খুব সুন্দর সমাধান :)
এপ্রিল

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

4
আমি নিশ্চিত না যে এখানে কী চলছে, তবে এটি আমাকে সহায়তা করতে পারেনি, কোনও ব্যবহারকারীই ভূমিকা নির্বিশেষে পদ্ধতিতে অ্যাক্সেস করতে সক্ষম হন।
উরিলজেন

4
@ উরিলজেন হিসাবে একই সমস্যা, তবে এটি জেরি ফিনগান ("সিস্টেম.ওয়েব.এমভিসি.অর্টিভাইজ অ্যাট্রিবিউট এবং নোট সিস্টেম না ব্যবহার করে) এর নীচে উত্তর দিয়ে ঠিক করা হয়েছিল
আরজেবি

13

নিশ্চিত হয়ে নিন যে আপনি নিজের কাস্টম অ্যাট্রিবিউট ক্লাসটি বন্ধ করছেন System.Web.Mvc.AuthorizeAttributeএবং না System.Web.Http.AuthorizeAttribute

আমি একই সমস্যা মধ্যে দৌড়ে। আমি একবার এটি পরিবর্তন করে ফেললাম, সবকিছু কাজ করে।

আপনি নিজের কাস্টম বৈশিষ্ট্য শ্রেণিতে নিম্নলিখিতগুলি যুক্ত করতে পারেন:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 

আমি কেবল এটি চেষ্টা করে দেখেছি এবং System.Web.Http.AuthorizeAttributeINSTEAD OFSystem.Web.Mvc.AuthorizeAttribute
ফ্রেজার জর্দান

13

এই সমস্যাটি সমাধান করার জন্য আমি সবচেয়ে ভাল এবং সহজ উপায়টি হ'ল অনুমোদনের বৈশিষ্ট্যের ক্ষেত্রে ভূমিকাগুলি একত্রিত করা।

[Authorize(Roles = CustomRoles.Admin + "," + CustomRoles.OtherRole)]

কাস্টমরোল সহ এমন ধ্রুব স্ট্রিং সহ একটি শ্রেণি:

public static class CustomRoles
{
    public const string Admin = "Admin";
    // and so on..
}

4
মূল্যবান; তবে এটি একটি মন্তব্য হওয়া উচিত; একটি উত্তর না।
ঘোস্টট্যাগ

4
সহজ এবং মার্জিত সমাধান!
আইওসিফ বান্সিওউ

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

যদি ভূমিকাগুলি এনামস ছিল তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন, [অনুমোদিত (ভূমিকাসমূহ = নাম (ব্যবহারকারীরোলইমন.উজার)) + "," + নামফ (ইউজাররোলইনম.এডমিন))]
বরুণ

3

আমি যা করেছি তা হ'ল উত্তরটি টাইসনে দেওয়া আছে

আমি তার উত্তরে কিছুটা টুইট করি। স্ট্রিংয়ের পরিবর্তে.জাইন কেন এটিকে তালিকায় রূপান্তর করবেন না?

আমার উত্তর এখানে:

public class AuthorizeRolesAttribute : AuthorizeAttribute
{
    private new List<string> Roles;
    public AuthorizeRolesAttribute(params string[] roles) : base()
    {
        Roles = roles.toList()
    }
}

এবং তারপরে ভূমিকাটি অন-অনুমোদনের ক্ষেত্রে ওভাররাইডিং বৈধ কিনা তা পরীক্ষা করে দেখুন

public override void OnAuthorization(HttpActionContext actionContext)
{
            if (Roles == null)
                HandleUnauthorizedRequest(actionContext);
            else
            {
                ClaimsIdentity claimsIdentity = HttpContext.Current.User.Identity as ClaimsIdentity;
                string _role = claimsIdentity.FindFirst(ClaimTypes.Role).Value;
                bool isAuthorize = Roles.Any(role => role == _role);

                if(!isAuthorize)
                    HandleUnauthorizedRequest(actionContext);
            }
        }

এবং সেখানে আপনার এটি রয়েছে, যদি এখন ভূমিকাটি সংস্থান অ্যাক্সেসের জন্য অনুমোদিত হয় তবে তা বৈধ হয়ে গেছে


1

আমি মনে করি আপনার কাছে প্রচুর পরিমাণে ভূমিকা না থাকলে কোনও কাস্টম অনুমোদনযোগ্য বৈশিষ্ট্য এই ইস্যুটির জন্য ওভারকিল।

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

public static class Roles
{
    public const string ADMIN = "Admin";
    public const string VIEWER = "Viewer";

    public const string ADMIN_OR_VIEWER = ADMIN + "," + VIEWER;
}

এবং তারপরে আপনি কন্ট্রোলার ক্লাস বা নিয়ামক পদ্ধতিতে (বা উভয়) এর মতো অনুমোদনের বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

[Authorize(Roles = Roles.ADMIN]
public class ExampleController : Controller
{
    [Authorize(Roles = Roles.ADMIN_OR_VIEWER)
    public ActionResult Create()
    {
        ..code here...
    }
}

4
এই উদাহরণটি কাজ করে না, বা কমপক্ষে আপনি ভাবেন এমন উপায় নয়। উদাহরণস্বরূপ, উপন্যাসের সময় ADMIN_OR_VIEWERঅ্যাকশনের ভূমিকাটি অপ্রয়োজনীয় কারণ আপনার যদি Createইতিমধ্যে ADMINভূমিকা না থাকে তবে আপনাকে পদ্ধতিতে যেতে দেওয়া হবে না । এই ক্ষেত্রে VIEWERডাকা পারবে না Createপদ্ধতি।
জন লিডেগ্রেন

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