এএসপি.নেট এমভিসিতে অনুমোদনের বৈশিষ্ট্যকে ওভাররাইড করুন


83

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

তবে আমার কাছে নিয়ামক এবং অন্য কোনও নিয়ামকের অননুমোদিত একটি ক্রিয়া থাকা দরকার। আমি এগুলি [Authorize(false)]বা অন্য কোনও কিছু দিয়ে তাদের সাজাতে সক্ষম হতে চেয়েছিলাম তবে এটি উপলভ্য নয়।

কোন ধারনা?

উত্তর:


101

সম্পাদনা করুন: এএসপি.নেট এমভিসি 4 যেহেতু অন্তর্নির্মিত অনুমতি দিন অজ্ঞাতনামা বৈশিষ্ট্যটি ব্যবহার করার পক্ষে সর্বোত্তম পন্থা ।

নীচের উত্তরটি ASP.NET MVC এর পূর্ববর্তী সংস্করণগুলিকে বোঝায়

অনুমোদনের প্রয়োজন আছে কি না তা নির্দিষ্ট করতে আপনি একটি Authorচ্ছিক বুল প্যারামিটার সহ স্ট্যান্ডার্ড অথরিজঅ্যাট্রিবিউট থেকে উত্তরাধিকার সূত্রে একটি কাস্টম অনুমোদনের বৈশিষ্ট্য তৈরি করতে পারেন।

public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
    private readonly bool _authorize;

    public OptionalAuthorizeAttribute()
    {
        _authorize = true;
    }

    public OptionalAuthorizeAttribute(bool authorize)
    {
        _authorize = authorize;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if(!_authorize)
            return true;

                    return base.AuthorizeCore(httpContext);
    }
}

তারপরে আপনি সেই বৈশিষ্ট্যটি সহ আপনার বেস নিয়ন্ত্রককে সাজাতে পারেন:

[OptionalAuthorize]
public class ControllerBase : Controller
{
}

এবং কোনও নিয়ন্ত্রণকারীদের জন্য আপনি অনুমোদন চান না কেবল একটি 'ভুয়া' - এর সাথে ওভাররাইড ব্যবহার করুন eg যেমন

[OptionalAuthorize(false)]
public class TestController : ControllerBase
{
    public ActionResult Index()
    {
        return View();
    }
}

আমি এটি ভেবে দেখেছি তবে আমি একটি সহজ সমাধানের জন্য আশা করছিলাম। তবে "যদি তারা" একটি সরবরাহ না করে তবে আপনার সমাধানটি সেরা।
আন্দ্রে রেনিয়া

4
[AllowAnonymous]বৈশিষ্ট্যটি ব্যবহার করা ভাল better
জয়দার

অপেক্ষা করুন ... সুতরাং নিয়ামকটি কেবলমাত্র একটি নির্দিষ্ট ধরণের শীর্ষ স্তরের শ্রেণীর বৈশিষ্ট্যটি সম্মান করে?
ট্রায়ঙ্কো

আপনি কি জানেন যে কেন এটি AllowAnonymous ব্যবহার করা ভাল? কারণ আপনার সূক্ষ্ম নিয়ন্ত্রণ রয়েছে। আমার ক্ষেত্রে, আমি কেবলমাত্র নির্দিষ্ট পরিবেশের জন্য অনুমোদনের এন্ডপয়েন্টগুলি অক্ষম করতে দেখছি, উদাহরণস্বরূপ লোকালহোস্টের জন্য আপনার এটির দরকার নেই। এটি আমার স্টার্টআপ.cs এ আমি যা করতে যাচ্ছিলাম তার থেকে আরও মার্জিত সমাধান সরবরাহ করে। আমরা এখানে 11 বছর পরে কথা বলছি।
sksallaj


15

আমার ব্যক্তিগত গ্রহণটি নিয়ামককে বিভক্ত করা হবে। কেবলমাত্র অন্য একটি নিয়ামক তৈরি করুন ক্রিয়াকলাপগুলির জন্য আপনাকে প্রমাণীকরণের প্রয়োজন হবে না।

অথবা আপনি থাকতে পারে:

  • BaseController
    প্রমাণীকরণের প্রয়োজন নেই - এখানে আপনার সমস্ত "বেস স্টাফ" রয়েছে :)।

  • BaseAuthController : BaseController
    এখানে সমস্ত ক্রিয়াকলাপের অনুমোদন প্রয়োজন require

আপনি যখন চান সুনির্দিষ্ট কোনও শ্রেণি থেকে প্রাপ্ত হয়ে এইভাবে আপনার প্রমাণীকরণ থাকতে পারে।


6

আপনি যদি চান যে কেবলমাত্র একটি ক্রিয়াকলাপ অন্যথায় অনুমোদিত নিয়ামককে অননুমোদিত করা আপনি এই জাতীয় কিছু করতে পারেন:

public class RequiresAuthorizationAttribute : ActionFilterAttribute
{
    private readonly bool _authorize;

    public RequiresAuthorizationAttribute()
    {
        _authorize = true;
    }

    public RequiresAuthorizationAttribute(bool authorize)
    {
        _authorize = authorize;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var overridingAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof (RequiresAuthorizationAttribute), false);

        if (overridingAttributes.Length > 0 && overridingAttributes[0] as RequiresAuthorizationAttribute != null && !((RequiresAuthorizationAttribute)overridingAttributes[0])._authorize)
            return;

        if (_authorize)
        {
            //redirect if not authenticated
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                //use the current url for the redirect
                var redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;

                //send them off to the login page
                //var redirectUrl = string.Format("?RedirectUrl={0}", redirectOnSuccess);
                var loginUrl = LinkBuilder.BuildUrlFromExpression<HomeController>(filterContext.RequestContext, RouteTable.Routes,
                                                                                  x => x.Login(redirectOnSuccess));
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.