يمكنك تمكين [تخويل] للتحكم ولكن تعطيله لعمل واحد؟

StackOverflow https://stackoverflow.com/questions/329500

  •  11-07-2019
  •  | 
  •  

سؤال

وأود أن استخدام [Authorize] عن كل عمل في وحدة تحكم المشرف بلدي إلا العمل Login.

[Authorize (Roles = "Administrator")]
public class AdminController : Controller
{
    // what can I place here to disable authorize?
    public ActionResult Login()
    {
        return View();
    }
}
هل كانت مفيدة؟

المحلول

وأنا لا أعتقد أنك تستطيع أن تفعل هذا مع السمة تخويل القياسية، ولكن هل يمكن أن تستمد السمة الخاصة بك من AuthorizeAttribute أن يأخذ قائمة من الإجراءات للسماح ويسمح بالوصول إلى مجرد تلك الإجراءات. يمكنك أن تبحث في المصدر للAuthorizeAttribute على www.codeplex.com للحصول على أفكار حول كيفية القيام بذلك. إذا كنت فعلت ذلك، قد تبدو مثل:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ]
public class AdminController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

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

    ... other, restricted actions ...
}

تعديل : في لمعلوماتك، أنا في نهاية المطاف ركض عبر حاجة إلى القيام بشيء مماثل لوحدي وذهبت اتجاه مختلف. أنا خلقت إذن الافتراضي مزود تصفية وتطبيق عامل تصفية يأذن العالمي. يستخدم مزود تصفية إذن انعكاس للتحقق ما إذا كان العمل أو وحدة تحكم لديه يأذن محددة السمة تطبق، وإذا كان الأمر كذلك، يرجئ إليها. وإلا، فإنه يطبق مرشح إذن الافتراضي. ويقترن هذا مع PublicAttribute المستمدة من AuthorizeAttribute التي تسمح بالوصول العام. الآن، أحصل الافتراضي تأمين وصول، ولكن يمكن منح حق الوصول العام عبر [Public] تطبيقه على عمل أو وحدة تحكم. ويمكن أيضا أكثر تفويض محدد يتم تطبيقها عند الضرورة. انظر بلدي بلوق على HTTP: // الزراعية الطازجة -code.blogspot.com/2011/04/default-authorization-filter-provider.html

نصائح أخرى

ويمكنك تزيين جهاز تحكم مع [تخويل] وبعد ذلك يمكنك فقط تزيين الطريقة التي تريد أن تعفي مع [AllowAnonymous]

هل يمكن تجاوز أسلوب OnAuthorization وحدة تحكم

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Login")
        {
            filterContext.Cancel = true;
            filterContext.Result = Login();
        }
    }

وهذا يعمل وإنما هو الإختراق.

ورمز الفئة كامل المستخدمة في الاختبار:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication2.Controllers
{
[HandleError]
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }


    public ActionResult About()
    {
        ViewData["Title"] = "About Page";

        return View();
    }


    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Index")
        {
            filterContext.Cancel = true;
            filterContext.Result = Index();
        }
    }
}
}

قد يكون انها ليست الفعلي، ولكن كتبت سمة مخصصة لي:

public class SelectableAuthorizeAttribute : AuthorizeAttribute
{
    public SelectableAuthorizeAttribute(params Type[] typesToExclude)
    {
        _typesToExlude = typesToExclude;
    }

    private readonly Type[] _typesToExlude;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = _typesToExlude.Any(type => filterContext.ActionDescriptor.ControllerDescriptor.ControllerType == type);

        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

وثم تسجيله في بلدي filetrs العالمية:

filters.Add(new SelectableAuthorizeAttribute(typeof(MyController)));

ونأمل أن يكون مفيدا لشخص

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top