فرض مرشح الإجراء على جميع إجراءات وحدة التحكم (C# / ASP.NET MVC)
-
20-09-2019 - |
سؤال
لقد قمت بعمل مرشح إجراء جديد (السمة ، على غرار [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()
{
}
}