Обработка безопасности запрещена в ASP.NET MVC с AspNetSqlRoleProvider - PullRequest
4 голосов
/ 28 января 2010

Я стараюсь защитить различные области моего приложения MVC, чтобы предотвратить доступ обычного пользователя к представлениям типа администратора. В настоящее время, если какой-либо пользователь вошел в систему и попытается просмотреть страницу «О программе» (готовый шаблон в Visual Studio), он просто перенаправит их на страницу входа. Я бы предпочел, чтобы пользователь был проинформирован о том, что у него нет разрешения на просмотр страницы.

[Authorize(Roles="Admin")]
public ActionResult About()
{
    return View();
}

Кажется излишним отправлять уже авторизованного пользователя на страницу входа в систему, когда у него нет разрешения.

1 Ответ

3 голосов
/ 29 января 2010

Вот атрибут, который я создал, который можно использовать для направления к несанкционированным действиям безопасности. он также позволяет вам указать причину, которая будет передана несанкционированному действию на контроллере безопасности, которое затем можно будет использовать для представления.

Вы можете создать любое количество свойств, чтобы настроить его под свое конкретное приложение, просто обязательно добавьте его в 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...