Как реализовать фильтры авторизации по ролям в методе JsonResults?

Мне нужна помощь в том, как авторизовать доступ к методам JsonResults по ролям. У меня есть примеры кодов ниже с использованием пользовательского атрибута авторизации фильтра, и он отлично работает с методами ActionResults и PartialViewResults, но не с JsonResults. Я хочу найти способ, при котором, если имя роли не имеет доступа к этому методу JsonResults, оно должно быть перенаправлено на неавторизованную страницу или просто не выполняться каким-либо образом, и если у него есть доступ, то он должен выполнить метод, но в этом случае , так себя не ведет. Он не будет выполнять метод JsonResult, даже если у роли есть к нему доступ. Как решить этот тип сценария? Спасибо... Ниже приведены коды, которые я использовал

public class RedirectUnauthorizedRoles : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {         
            if (this.AuthorizeCore(filterContext.HttpContext))
            {
                base.OnAuthorization(filterContext);
            }
            else
            {

                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Error", Action = "Unauthorised" }));
            }
        }
    }

Он отлично работает, используя это

[RedirectUnauthorizedRoles(Roles = "MANAGER, ADMIN, SUPPORT")]  
public ActionResult Index()
{
return View();
}

но не на этом ниже

[RedirectUnauthorizedRoles(Roles = "MANAGER, ADMIN, SUPPORT")]  
public JsonResult GetSpecialData(string param1)
{
 // statement here...
}

person timmack    schedule 15.02.2018    source источник
comment
Если это JsonResult, он предлагает использовать ajax для вызова этого метода, а вызовы ajax не могут перенаправляться (вся их цель - оставаться на той же странице)   -  person    schedule 15.02.2018
comment
да, вы правы, но я хочу выполнить метод JsonResult, если у роли есть к нему доступ. Прямо сейчас он не будет выполнять метод, поэтому он возвращает null.   -  person timmack    schedule 15.02.2018
comment
Что произойдет, если вы просто примените стандартный атрибут [Authorize(Roles = "..")]?   -  person    schedule 15.02.2018
comment
Таким образом, если я использую стандартный атрибут Authorize, он будет продолжать запрашивать предупреждение о необходимости аутентификации на веб-странице для входа в систему с вашим именем пользователя и паролем, и даже если я вхожу в систему с именем пользователя и паролем, он все еще продолжает запрашивать.   -  person timmack    schedule 15.02.2018
comment
Это не имеет смысла, если вы уже вошли в систему. Что произойдет, если вы просто перейдете к этому методу через адресную строку?   -  person    schedule 15.02.2018
comment
Если вы принудительно просматриваете адресную строку с использованием URL-адреса этого метода JsonResult... Он по-прежнему ведет себя так же. Еще бы подсказать вам оповещение.   -  person timmack    schedule 15.02.2018
comment
Вот что мне интересно... если вы примените его к JsonResult, он не распознает роли в атрибуте, но отлично работает с ActionResults.   -  person timmack    schedule 15.02.2018


Ответы (1)


Привет @timmack в RedirectUnauthorizedRoles Filter я вернул JsonResult. если пользователь действителен, мы собираемся вернуть «1» в качестве значения, а если пользователь недействителен, мы собираемся вернуть «0» в метод Ajax, я надеюсь, что это может вам помочь.

Фильтр

public class RedirectUnauthorizedRoles : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (this.AuthorizeCore(filterContext.HttpContext))
        {
            base.OnAuthorization(filterContext);
        }
        else
        {

           //Example if User is Valid then i will return 1 else it will return 0
            var value = true ? "1" : "0";

            filterContext.Result = new JsonResult()
            {
                Data = value
            };
        }
    }
}

Аякс-метод

    <script type="text/javascript">
        function demox() {
            $.ajax({
                url: '/Controller/ActionMethod',
                type: "POST",
                data: { 'token': 'Demo' },
                contentType: false,
                processData: false,
                success: function (result) {

                    if (result === "0")
                    {
                        alert("Not Authorized");
                        return window.location.href = "/Error/Error";
                    }

                    return window.location.href = "/ValidPage URL";
                },
                error: function (err)
                {
                    alert(err.statusText);
                }
            });
        }

</script>
person Saineshwar    schedule 17.02.2018