首页 文章

使用 http 200 响应自定义消息处理我的未授权请求

提问于
浏览
0

我在我的 asp.net mvc Web 应用程序中有以下自定义授权类,我在我的操作方法之前调用它: -

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]

    public class CheckUserPermissionsAttribute : AuthorizeAttribute
    {

        public string Model { get; set; }
        public string Action { get; set; }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.Request.IsAuthenticated)
                return false;
            //code goes here................
            if (!repository.can(ADusername, Model, value)) // implement this method based on your tables and logic
            { return false; }
            return true;

        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {

                var viewResult = new JsonResult();
                viewResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                viewResult.Data = (new { IsSuccess = "Unauthorized", description = "Sorry, you do not have the required permission to perform this action." });
                filterContext.Result = viewResult;

            }
            else
            {
                var viewResult = new ViewResult();

                viewResult.ViewName = "~/Views/Errors/_Unauthorized.cshtml";

                filterContext.Result = viewResult;
            }

         //   base.HandleUnauthorizedRequest(filterContext);
        }
    }

我在我的行动方法之前调用此自定义授权如下: -

[CheckUserPermissions(Action = "Read", Model = "Accounts")]
public ActionResult Index(){

目前正如上面的代码所示,当请求未被授权时,我将根据请求类型返回 JSON 或部分视图(如果它是 Ajax 请求)。

在我的代码中,我总是负责处理从 onsuccess 脚本中的自定义授权类返回的 json,如下所示: -

function addrecords(data) {
    if (data.IsSuccess == "Unauthorized") {

        jAlert(data.description, 'Unauthorized Access');
    }
    else        if (data.IsSuccess) {

            jAlert(data.description, 'Creation Confirmation');
    }

目前我的方法运作良好,但我开始考虑是否应该继续我不会因未经授权的请求重新调整 401 http 响应这一事实?而不是我返回一个 http 200,作为状态=“unauthrized”的 json 对象或重定向到局部视图?

有人可以建议吗?

谢谢。

1 回答

  • 2

    我曾经这样做过:

    if (filterContext.HttpContext.Request.IsAjaxRequest())
     {
          filterContext.HttpContext.Response.StatusCode = 403;
          filterContext.Result = new JsonResult { Data = "LogOut" };
     }
     else
     {
          filterContext.Result = new RedirectResult("~/Home/Index");
     }
    

    并在 jquery 我签入通用ajaxError

    $(document).ajaxError(function(xhr, statusText, err){
    
        if(xhr.status == 403) {
    
          alert("Unathorized Request");
    
       }
    
    });
    

    要么:

    $.ajaxSetup({
    
     error: function (x, e) {
    
         if (x.status == 403) {
    
             alert("Unauthorized Access");
    
    }
    
     });
    
    });
    

    在你的方法中你必须检查每个 Ajax 调用成功响应即将发生的事情,但在这种方法中,在未经授权的情况下返回 403 代码将使 Ajax 调用失败并执行错误回调,我们用来为 Ajax 编写通用错误处理程序检查状态代码是否是 ui 返回然后显示消息,它是未经授权的请求。

    你可以看到细节:Asp.net mvc 检查用户已登录并在访问页面之前获得授权

相关问题