নিয়ামক পদক্ষেপ অ্যাক্সেস একাধিক ভূমিকা অনুমতি দিন


274

"সদস্যদের" আমার নিয়ামক ক্রিয়ায় অ্যাক্সেসের অনুমতি দেওয়ার জন্য এই মুহুর্তে আমি এই জাতীয় একটি পদ্ধতি সাজাই dec

[Authorize(Roles="members")]

আমি কীভাবে একাধিক চরিত্রের অনুমতি দেব? উদাহরণস্বরূপ নিম্নলিখিতটি কাজ করে না তবে এটি দেখায় যে আমি কী করতে চাইছি ("সদস্য" এবং "প্রশাসককে" অ্যাক্সেসের অনুমতি দিন):

[Authorize(Roles="members", "admin")] 

4
এই প্রশ্নের গৃহীত উত্তর পরিবর্তন করুন। বর্তমানে গৃহীত উত্তর সহ ব্যক্তি এটি সম্পাদনা করেছেন যে তিনি ভুল ছিলেন ating
এরিক জে।

উত্তর:


595

অন্য বিকল্পটি হ'ল আপনি পোস্ট করার সাথে সাথে একক অনুমোদনের ফিল্টারটি ব্যবহার করতে পারেন তবে অভ্যন্তরীণ উদ্ধৃতিগুলি সরিয়ে ফেলুন।

[Authorize(Roles="members,admin")]

5
এমভিসি 5 তেও কাজ করে। +1
gkonuralp

4
এএসপি.নেট কোর ১.০ (এমভিসি)) এবং মাইক্রোসফ্ট.এএসপনেট.এডেন্টিটি ভি ৩। *
সোরেন

3
এটি ঠিক আছে যদি আপনার কাছে এমন একটি নিয়ামক থাকে যা আপনাকে অনুমোদিত করতে হবে। আপনার যদি একের বেশি থাকে তবে আপনি সেই স্ট্রিং ধ্রুবকগুলি (ইয়াক) নকল করছেন। আমি অনেকটা স্থির শ্রেণিকে পছন্দ করি যার ভূমিকার নাম রয়েছে। আমার পোষা ঘৃণা সদৃশ স্ট্রিং ... খুব খারাপ।
রোবনিক

1
@ ক্রেগ সুসংবাদ যে আপনি আপনার সমস্যার সমাধান করেছেন। এখন, আপনার মন্তব্যগুলি মুছে ফেলার বিষয়ে বিবেচনা করুন, দয়া করে
পাবলো ক্লজ

1
কেন? এটি কাজ করতে আমার বয়স হয়েছিল ages এটি একই সমস্যার সম্মুখীন অন্য কারও পক্ষে সহায়ক হতে পারে।
ক্রাগ

129

আপনি যদি কাস্টম রোলগুলি ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

CustomRoles শ্রেণী:

public static class CustomRoles
{
    public const string Administrator = "Administrador";
    public const string User = "Usuario";
}

ব্যবহার

[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]

আপনার কয়েকটি ভূমিকা থাকলে সম্ভবত আপনি এগুলি (স্পষ্টতার জন্য) সংযুক্ত করতে পারেন:

public static class CustomRoles
{
     public const string Administrator = "Administrador";
     public const string User = "Usuario";
     public const string AdministratorOrUser = Administrator + "," + User;  
}

ব্যবহার

[Authorize(Roles = CustomRoles.AdministratorOrUser)]

7
এটি এমন একটি উত্তরের উত্তর হবে, যদি আপনি কাস্টমোলসের পিছনে কী জানেন না এমন লোকদের ব্যাখ্যা করে থাকেন।
জেমস স্কেম্প

1
@ জেমসস্ক্যাম্প ঠিক আছে, আমি আমার উত্তরটি বাড়িয়েছি। এটা খুব সহজ। কাস্টমরোলস এমন একটি বর্গ যা আমি তৈরি করেছি যা কিছু অবিচ্ছিন্ন রয়েছে, যা আমার অ্যাপ্লিকেশন ভূমিকার সাথে মিল রাখে। আমি এটি কয়েকটি কারণে করেছি: 1) এটি বুদ্ধি সংক্রান্ত ভুল এড়াতে ইন্টেলিজেন্স ব্যবহারের অনুমতি দেয় 2) রক্ষণাবেক্ষণকে সহজ করার জন্য। যদি কোনও ভূমিকা পরিবর্তন হয় তবে আমার আবেদনের মধ্যে আমাকে কেবলমাত্র একটি জায়গা আপডেট করতে হবে।
পাবলো ক্লজ

@ পাব্লোকর বিকল্পভাবে আপনি একটি ফ্ল্যাগের বৈশিষ্ট্য সহ একটি এনাম তৈরি করতে পারেন, যেমন কনভার্ট T টোস্ট্রিং (কাস্টমআরলস d অ্যাডমিনিস্ট্রেটর | কাস্টম রোলস U ইউজার); - বিরক্তিকর অংশটি হ'ল এর জন্য একটি স্পষ্ট রূপান্তর প্রয়োজন
স্যাটেলাইট

আপনার যদি 39 ভূমিকা থাকে?
কিকিনেট

আমি মনে করি আপনার সমস্যা। নেট দিয়ে কী করা যায় তার বাইরে পারমিটের মডেলিংয়ের মধ্য দিয়ে যায়
পাবলো ক্লজ

82

একটি সম্ভাব্য সরলীকরণ হ'ল সাবক্লাস AuthorizeAttribute:

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

ব্যবহার:

[Roles("members", "admin")]

শব্দার্থগতভাবে এটি জিম শ্মেহিলের উত্তর হিসাবে একই।


3
এটি আমার পক্ষে কাজ করে না, লগ ইন করা ব্যবহারকারী ব্যবহারকারীর কোনও ভূমিকা না থাকলেও বৈশিষ্ট্যটিকে বাইপাস করতে সক্ষম হন।
উরিলজেন

9
এই উত্তরটি যখন আপনি ধ্রুবককে আপনার মান হিসাবে ব্যবহার করছেন তখন এর জন্য ভাল: যেমন [ভূমিকা (কনস্ট্যান্টস।
অ্যাডমিন

3
এটি সেরা উত্তর
ইগোরশচ

18

এমভিসি 4 এর জন্য, আমার ভূমিকাগুলির সাথে একটি Enum( UserRoles) ব্যবহার করে, আমি একটি কাস্টম ব্যবহার করি AuthorizeAttribute

আমার নিয়ন্ত্রিত ক্রিয়া সম্পর্কে, আমি এটি করি:

[CustomAuthorize(UserRoles.Admin, UserRoles.User)]
public ActionResult ChangePassword()
{
    return View();
}

এবং আমি এর AuthorizeAttributeমতো একটি কাস্টম ব্যবহার করি:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorize : AuthorizeAttribute
{
    private string[] UserProfilesRequired { get; set; }

    public CustomAuthorize(params object[] userProfilesRequired)
    {
        if (userProfilesRequired.Any(p => p.GetType().BaseType != typeof(Enum)))
            throw new ArgumentException("userProfilesRequired");

        this.UserProfilesRequired = userProfilesRequired.Select(p => Enum.GetName(p.GetType(), p)).ToArray();
    }

    public override void OnAuthorization(AuthorizationContext context)
    {
        bool authorized = false;

        foreach (var role in this.UserProfilesRequired)
            if (HttpContext.Current.User.IsInRole(role))
            {
                authorized = true;
                break;
            }

        if (!authorized)
        {
            var url = new UrlHelper(context.RequestContext);
            var logonUrl = url.Action("Http", "Error", new { Id = 401, Area = "" });
            context.Result = new RedirectResult(logonUrl);

            return;
        }
    }
}

এটি ফ্যাব্রিকিও মার্টিনিজ তামাयो https://github.com/fabriciomrtnz/FNHMVC/ দ্বারা পরিবর্তিত এফএনএইচএমভিসির অংশ is


1
আপনার অন-অনুমোদন পদ্ধতিতে ব্যবহারকারীর সমস্ত তালিকাভুক্ত ভূমিকা থাকতে হবে ; সে ইচ্ছাকৃত ছিল, না আপনি সেই লুপটিতে একটি বিরতি অনুভব করছেন?
টাইসন টি।

@ টাইসন: আমি এটি বেশ কাছাকাছি পরিদর্শন করেছি, এটি অবশ্যই মনে হচ্ছে যে এই লুপটিতে একটি বিরতি প্রয়োজন।
ওসেলোটএক্সএল

@TiesonT। এবং @ মাদ্রাশ, আমি আপনার সংশোধনকে প্রশংসা করি, এটি লুপের ভিতরে সত্যিই বিরতি পেতে পারে। আমি উপরের কোডটি পরিবর্তন করব।
বার্নার্ডো লোরেইরো

Enum UserRoles চমৎকার। আপনি কি এটি ম্যানুয়ালি ঘোষণা করেন বা এটি ডিবি-এর বিষয়বস্তুর উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে তৈরি হয়েছে?
কনরাড ভিল্টারস্টন

@ কনরাডভিল্টারস্টেন এটি ম্যানুয়ালি তবে আমার ধারণা প্রতিবিম্ব এবং ডায়নামিক শ্রেণীর দ্বারা স্বয়ংক্রিয়ভাবে সম্পন্ন করা সম্ভব
বার্নার্ডো লোরেইরো

3

আর একটি পরিষ্কার সমাধান, আপনি কনভেনশন রাখতে এবং একাধিক [অনুমোদিত] বৈশিষ্ট্য যুক্ত করতে ব্যবহার করতে পারেন। এটা দেখ:

public static class RolesConvention
{
    public const string Administrator = "Administrator";
    public const string Guest = "Guest";
}

তারপরে নিয়ামকটিতে:

[Authorize(Roles = RolesConvention.Administrator )]
[Authorize(Roles = RolesConvention.Guest)]
[Produces("application/json")]
[Route("api/[controller]")]
public class MyController : Controller

14
একাধিক Authorizeবৈশিষ্ট্য নিয়োগ এবং শব্দার্থবিজ্ঞান এবং সমস্ত শর্ত পূরণ করা প্রয়োজন (যেমন ব্যবহারকারী প্রশাসক এবং অতিথি ভূমিকা উভয় হতে হবে)।
ট্রলিস্ট

3

যদি আপনি নিজেকে এই 2 টি ভূমিকাটি প্রায়শই প্রয়োগ করে দেখতে পান তবে আপনি তাদের তাদের নিজস্ব অনুমোদনে মুড়ে রাখতে পারেন। এটি সত্যই গৃহীত উত্তরের একটি এক্সটেনশন।

using System.Web.Mvc;

public class AuthorizeAdminOrMember : AuthorizeAttribute
{
    public AuthorizeAdminOrMember()
    {
        Roles = "members, admin";
    }
}

এবং তারপরে অ্যাকশনে আপনার নতুন অনুমোদন প্রয়োগ করুন। আমি মনে করি এটি পরিষ্কার দেখায় এবং সহজেই পড়তে পারে।

public class MyController : Controller
{
    [AuthorizeAdminOrMember]
    public ActionResult MyAction()
    {
        return null;
    }
}

1

একটি সাবক্লাস যুক্ত করার সাথে আরও ভাল কোড AuthorizeRole.cs

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    class AuthorizeRoleAttribute : AuthorizeAttribute
    {
        public AuthorizeRoleAttribute(params Rolenames[] roles)
        {
            this.Roles = string.Join(",", roles.Select(r => Enum.GetName(r.GetType(), r)));
        }
        protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
                filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                  { "action", "Unauthorized" },
                  { "controller", "Home" },
                  { "area", "" }
                  }
              );
                //base.HandleUnauthorizedRequest(filterContext);
            }
            else
            {
                filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                  { "action", "Login" },
                  { "controller", "Account" },
                  { "area", "" },
                  { "returnUrl", HttpContext.Current.Request.Url }
                  }
              );
            }
        }
    }

এটি কীভাবে ব্যবহার করবেন

[AuthorizeRole(Rolenames.Admin,Rolenames.Member)]

public ActionResult Index()
{
return View();
}

1

AspNetCore 2.x ব্যবহার করে আপনাকে কিছুটা ভিন্ন পথে যেতে হবে:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class AuthorizeRoleAttribute : AuthorizeAttribute
{
    public AuthorizeRoleAttribute(params YourEnum[] roles)
    {
        Policy = string.Join(",", roles.Select(r => r.GetDescription()));
    }
}

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

[Authorize(YourEnum.Role1, YourEnum.Role2)]

-2
Intent promptInstall = new Intent(android.content.Intent.ACTION_VIEW);
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
promptInstall.setDataAndType(Uri.parse("http://10.0.2.2:8081/MyAPPStore/apk/Teflouki.apk"), "application/vnd.android.package-archive" );

startActivity(promptInstall);

1
কোড সহ উত্তরগুলির কমপক্ষে একটি মিনিমাম বিবরণ থাকা উচিত যা কোডটি কীভাবে কাজ করে এবং কেন এটি প্রশ্নের উত্তর দেয় expla আরও কোড কোড বিভাগ বিন্যাস উন্নত করা প্রয়োজন।
রবার্তো ক্যাবনি

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