فرض مرشح الإجراء على جميع إجراءات وحدة التحكم (C# / ASP.NET MVC)

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

سؤال

لقد قمت بعمل مرشح إجراء جديد (السمة ، على غرار [OuDize]) الذي يسمح للوصول إلى إجراء وحدة تحكم بناءً على قيمة جلسة. ومع ذلك ، أقوم بتزيين جميع تصرفات وحدة التحكم الخاصة بي بهذه السمة (باستثناء عدد قليل جدًا).

لذلك ، اعتقدت أنه سيكون من الأفضل أن يكون لديك مرشح الإجراء هذا دائماً أعدم إلا في الحالات التي أرفق فيها سمة [appermedfromauthorize] بعمل وحدة تحكم؟ (ربما عبر الوراثة إلى فئة وحدة التحكم الخاصة بي؟)

كيف يمكنني أن أفعل هذا؟

هل كانت مفيدة؟

المحلول

الجري مع JEEF3إجابة ، توصلت إلى هذا. يمكن أن تستخدم المزيد من التحقق من الأخطاء والمتانة مثل إجراءات متعددة محددة ، ولكن الفكرة العامة تعمل.

في حالتك المحددة ، يمكنك اختبار قيمة الجلسة وتقرر العودة من التفويض أيضًا.

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

الاستخدام:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...

نصائح أخرى

تحقق من مقالتي على codeproject -

http://www.codeproject.com/kb/web-security/authorizewithexemptions.aspx

في هذه المقالة ، سأقدم لك حلًا لتأمين وحدات التحكم في تطبيق ASP.NET MVC بطريقة يتم تأمين جميع الإجراءات باستثناء تلك التي تحددها على أنها غير آمنة.

القناص من الكود:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}

أفهم أن السؤال قديم جدًا ولكن على أي حال .. إذا كنت ترغب في تطبيق مرشح على جميع الإجراءات ، فما عليك سوى إضافة الأسطر التالية إلى Global.asax:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

وفي مرشح الإجراء ، يمكنك فقط التحقق مما إذا كان الإجراء يحتوي على أي سمات أخرى في الطريق التالي:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}

ربما حاول وإضافة Except خاصية إلى السمة الأولى؟

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}

يمكنك إضافة السمة إلى الفصل لجعلها تنطبق على جميع الطرق في تلك الفئة

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

لا أعرف كيفية استبعاد طريقة محددة من سمة مستوى الفصل. ربما تستخدم وحدة تحكم منفصلة لطلبات غير مصادقة؟

لأي شخص يقرأ هذا في عام 2013+ ، يدعم MVC4 الآن استخدام [lemanonymous

يمكنك وضع التصريح على وحدة التحكم ، ثم السماح مجهول الهوية على أي وظائف لا ترغب في التصريح بها.

مثال:

تفويض] HomeController من الطبقة العامة: Controller {

[AllowAnonymous]
public ActionResult Index()
{

} 

}

هل سيعمل هذا مع مرشح [myauthorize] المخصص أم أنه يعمل فقط مع [Outmive

لأي شخص يقرأ هذا في 2013+ ، يدعم MVC4 الآن استخدام [AllowAnonymous]

يمكنك وضع التصريح على وحدة التحكم ، ثم السماح مجهول الهوية على أي وظائف لا ترغب في التصريح بها.

مثال:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

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