This code is my extended ActionFilterAttribute as RequireLoginAttribute and RequireRoleAttribute for form authentication, I just write the BaseController to public the Controller's RedirectToAction function for use it in extended ActionFilterAttribute.
Just for fun with codingļ¼
namespace Bolik.Web.Mvc
{
using System;
using System.Web.Mvc;
using System.Threading;
public class BaseController : Controller
{
protected override void Execute(ControllerContext controllerContext)
{
try
{
base.Execute(controllerContext);
}
catch (Exception e)
{
if (!(e is ThreadAbortException))
{
ViewData["ErrorMessage"] = e.Message;
RenderView("Error", ViewData);
}
}
}
public new void RedirectToAction(string actionName, string controllerName)
{
base.RedirectToAction(actionName, controllerName);
}
}
public class RequireLoginAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
if (filterContext.Controller is BaseController)
{
var b = filterContext.Controller as BaseController;
if (b != null)
{
if (!b.User.Identity.IsAuthenticated)
{
filterContext.Cancel = true;
b.RedirectToAction("Login", "Security");
}
}
}
base.OnActionExecuting(filterContext);
}
}
public class RequireRoleAttribute : ActionFilterAttribute
{
private readonly string _RoleName;
public RequireRoleAttribute(string roleName)
{
_RoleName = roleName;
}
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
if (filterContext.Controller is BaseController)
{
var b = filterContext.Controller as BaseController;
if (b != null)
{
if (!b.User.IsInRole(_RoleName))
{
filterContext.Cancel = true;
b.RedirectToAction("AccessDenied", "Error");
}
}
}
base.OnActionExecuting(filterContext);
}
}
}