Вот атрибут, который я создал, который можно использовать для направления к несанкционированным действиям безопасности. он также позволяет вам указать причину, которая будет передана несанкционированному действию на контроллере безопасности, которое затем можно будет использовать для представления.
Вы можете создать любое количество свойств, чтобы настроить его под свое конкретное приложение, просто обязательно добавьте его в RouteValueDictionary.
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class ApplySecurityAttribute : ActionFilterAttribute
{
private readonly Permission _permission;
public ApplySecurityAttribute(Permission permission)
: this(permission, string.Empty) {}
public ApplySecurityAttribute(Permission permission, string reason)
{
_permission = permission
Reason = reason;
}
public string Reason { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!PermissionsManager.HasPermission(_permission)) // Put security check here
{
var routeValueDictionary = new RouteValueDictionary
{
{ "controller", "Security" }, // Security Controller
{ "action", "Unauthorized" }, // Unauthorized Action
{ "reason", Reason } // Put the reason here
};
filterContext.Result = new RedirectToRouteResult(routeValueDictionary);
}
base.OnActionExecuting(filterContext);
}
}
Вот контроллер безопасности
public class SecurityController : Controller
{
public ViewResult Unauthorized(string reason)
{
var vm = new UnauthorizedViewModel { Reason = reason };
return View(vm);
}
}
Вот объявление атрибута на контроллере, который вы хотите защитить
[ApplySecurity(Permission.CanNuke, Reason = "You are not authorized to nuke!")]
Вот как PermissionsManager выполняет проверку, чтобы увидеть, есть ли у пользователя разрешения
public static class PermissionsManager
{
public static bool HasPermission(EZTracPermission permission)
{
return HttpContext.Current.GetCurrentUser().Can(permission);
}
}