Razor Pages - Попытка реализовать фильтр действий на странице Razor - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу написать собственный фильтр, который будет проверять, вошел ли пользователь на мой сайт, и перенаправит его обратно на страницу входа, если это не так.

Я хочу, чтобы фильтр применялся автоматическина страницу при загрузке.

Я пробовал решение, показанное ниже, но фильтр на данный момент не работает.

Код фильтра:

using Microsoft.AspNetCore.Mvc.Filters;

namespace MODS.Filters
{
    public class AuthorisationPageFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            System.Diagnostics.Debug.Write("Filter Executed");  //write to debugger to test if working

            //add real code here

            base.OnActionExecuted(context);
        }
    }
}

Далее, вот атрибут фильтра, примененный к модели страницы:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using MODS.Filters;

namespace MODS.Pages.Menus
{
    [AuthorisationPageFilter]
    public class Admin_MainMenuModel : PageModel
    {
        public ActionResult Admin_MainMenu()
        {
            System.Diagnostics.Debug.Write("Function Executed");
            return new ViewResult();
        }
    }
}

У меня сложилось впечатление, что вам нужно вызвать действие / метод на странице, чтобы функция применялась при загрузке страницы (скажите, пожалуйста,я, если это правильно), так вот код, вызывающий метод Admin_MainMenu в файле страницы .cshtml (в блоке кода в верхней части страницы бритвы):

Model.Admin_MainMenu();

Мои текущие мыслиэто либо: 1. сам фильтр неправильного типа (может быть IPageFilter вместо этого?) 2. неправильный способ его реализации (либо когда я применяю его к модели страницы, либо когда я вызываюметод на странице).

любой часЭЛЬП очень ценится.Благодаря.

1 Ответ

0 голосов
/ 29 ноября 2018

Этот ответ предназначен для AspNet MVC, а не для AspNetCore MVC, но может быть кому-то полезен:

Если это для авторизации, я бы использовал AuthorizeAttribute class.

Примерно так:

using System.Web.Mvc;

namespace MODS.Filters
{
    public class CustomAuthorizeUserAttribute : AuthorizeAttribute
    {
        // Custom property, such as Admin|User|Anon
        public string AccessLevel { get; set; }

        // Check to see it the user is authorized
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            System.Diagnostics.Debug.Write("Authorize Executed");  //write to debugger to test if working

            // Use Core MVC Security Model
            var isAuthorized = base.AuthorizeCore(httpContext);
            if (!isAuthorized)
            {
                return false;
            }

            // Or use your own method of checking that the user is logged in and authorized. Returns a Boolean value.
            return MySecurityHelper.CheckAccessLevel(AccessLevel);
        }

        // What to do when not authorized
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(
                        new
                        {
                            controller = "Error",
                            action = "NotFound"
                        })
                    );
        }
    }
}

Затем украсьте контроллер или действие с атрибутом CustomAuthorizeUser:

using MODS.Filters;

namespace MODS.Pages.Menus
{
    [CustomAuthorizeUser(AccessLevel = "Admin")]
    public class Admin_MainMenuModel : PageModel
    {
        public ActionResult Admin_MainMenu()
        {
            System.Diagnostics.Debug.Write("Function Executed");
            return new ViewResult();
        }
    }
}

Надеюсь, что этопомогает!

...