MVC авторизовать атрибут один раз в контроллере - PullRequest
0 голосов
/ 05 июля 2018

Это содержимое класса CustomAuthorizeAttribute:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
         return (CurrentUser.IsInRole(MasterRole, ChildRole)) ? true : false;
    }
}

И мой контроллер:

[CustomAuthorize(MasterRole="Master")]
public class HomeController : Controller
{
...
    [CustomAuthorize(ChildRole = "Child")]
    public ActionResult Slider()
    {
        return View();
    }
...
}

В этом использовании для класса CustomAuthorizeAttribute ChildRole приходит как «Child», все нормально, но MasterRole возвращается в ноль.

Как я могу определить "MasterRole" только один раз в контроллере, или это возможно?

Я имею в виду, он работает как синтаксис ниже, но я не хочу определять MasterRole для каждого действия, как показано ниже:

    [CustomAuthorize(MasterRole = "Master", ChildRole = "Child")]
    public ActionResult Slider()
    {
        return View();
    }

1 Ответ

0 голосов
/ 06 июля 2018

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

Добавьте два новых атрибута, например, так:

public class SetMasterRoleAttribute : AuthorizeAttribute
{
    public string MasterRole;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        httpContext.Items.Add("MasterRole", MasterRole);
        return true;
    }
}

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public string ChildRole;
    public string MasterRole;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (string.IsNullOrEmpty(MasterRole))
        {
            MasterRole = httpContext.Items["MasterRole"] as string;
        }

        return (CurrentUser.IsInRole(MasterRole, ChildRole)) ? true : false;
    }
}

А затем настройте свой контроллер и выполните следующие действия:

[SetMasterRole(MasterRole = "Master")]
public class HomeController : Controller
{
    [CustomAuthorize(ChildRole = "Child")]
    public ActionResult Index()
    {
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...