【问题标题】:How to implement Authorize filters by Roles on JsonResults method?如何在 JsonResults 方法上通过角色实现授权过滤器?
【发布时间】:2018-02-15 03:10:46
【问题描述】:

我需要有关如何授权按角色访问 JsonResults 方法的帮助。我有下面使用自定义授权过滤器属性的示例代码,它适用于 ActionResultsPartialViewResults 方法,但不适用于 json结果。我想找到一种方法,如果角色名称无法访问该 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...
}

【问题讨论】:

  • 如果它是JsonResult,它建议您使用 ajax 来调用该方法,并且 ajax 调用无法重定向(它们的全部意义在于保持在同一页面中)
  • 是的,你是对的,但我想要发生的是如果角色有权访问它,则执行 JsonResult 方法。现在,它不会执行该方法,所以它返回 null。
  • 只应用标准的[Authorize(Roles = "..")] 属性会发生什么?
  • 所以,如果我使用标准的 Authorize 属性,它会在网页上不断提示“需要身份验证”警报以登录您的用户名和密码,即使我登录了用户名和密码,它仍然不断提示。
  • 如果您已经登录,那将毫无意义。当您通过地址栏导航到该方法时会发生什么?

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-3 jsonresult


【解决方案1】:

您好 @timmack 在 RedirectUnauthorizedRoles 过滤器中我已返回 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
            };
        }
    }
}

Ajax 方法

    <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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2012-12-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多