Фильтр пользовательской авторизации ASP.NET MVC 4 для класса и метода контроллера - PullRequest
0 голосов
/ 28 сентября 2018

Я видел это stackoverflowQuestion , но это вращается вокруг использования атрибута, Authorize.Я использую пользовательский атрибут авторизации, расширяя AuthorizeAttribute.

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

итак,

[AuthorizeUser("Transact")]
public class HomeController : Controller
{
    //
    // GET: /Search/Home/

    public ActionResult Index()
    { 
        return View();
    }

    [AuthorizeUser("Search")]
    public ActionResult Search()
    { 
        return View();
    }

}

При этом среда проверяет, есть ли у пользователя роль Transact и Search. Я просто хочу проверить роль поиска в этомсценарий.

Я снова использую эту функцию поиска и частичное представление в другой области.

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Вы можете попробовать в верхней части контроллера, как показано ниже, это будет поддерживать несколько ролей для одного контроллера, или вы можете использовать один и тот же фильтр авторизации (Roles = "Admin") вверху каждого действия ....

[Authorize(Roles = "Admin,HRManager,Finance")]
Public class MyController:Controller{

  // inside controller action methods
 }
0 голосов
/ 02 октября 2018

Возвращаясь к ссылке, которую я разместил: stackoverflowQuestion Я смог заставить ее работать в моей ситуации.Кажется, что происходит, когда вызов моего действия сначала просматривает атрибут с уровня Controller, но использование filterContext.ActionDescriptor.IsDefined внутри метода OnAuthroization скажет мне, если к вызываемому действию прикреплен мой атрибут override.Если он пропустит вызов метода base.OnAuthorization, то будет вызван атрибут override.

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

Вот пример, чтобы разобраться во всем этом.

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    protected bool isOverrideAuthorize = false;

    public AuthorizeUserAttribute(params...)
    {
    }

    public AuthorizeUserAttribute(MenuItems...)
    {
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var action = filterContext.ActionDescriptor;
        if (action.IsDefined(typeof(OverrideAuthorizeUserAttribute), true) && !isOverrideAuthorize)
        {
            return;
        }

        base.OnAuthorization(filterContext);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {

    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
    }
  }

Класс переопределения:

public class OverrideAuthorizeUserAttribute : AuthorizeUserAttribute
{
    public OverrideAuthorizeUserAttribute(params...) : base(roles)
    {
        base.isOverrideAuthorize = true;
    }

    public OverrideAuthorizeUserAttribute(MenuItems...) : base(item)
    {
        base.isOverrideAuthorize = true;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }
}

Это позволило мне выполнить авторизацию для действия исключительно на атрибуте авторизации, объявленном для этого действия, а не на атрибуте авторизации на контроллере ANDметод действия по умолчанию.

Кроме того, MVC5, похоже, решает эту проблему путем включения атрибута "OverrideAuthorization". К сожалению, я все еще нахожусь на MVC4.

...