Как создать собственный атрибут JsonAuthorize для безопасных действий, который возвращает JsonResults? - PullRequest
1 голос
/ 09 августа 2011

Я думал о том, как правильно защитить действие JsonResult с помощью пользовательского атрибута, вместо того, чтобы делать что-то подобное для каждого действия, как, например, сказать здесь ASP.NET MVC JsonResult и AuthorizeAttribute

if (!User.Identity.IsAuthenticated)
    return Json("Need to login");

Но вопрос в том, как мне создать такой атрибут, который бы возвращал Json. Итак, я начал с этого:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class JsonAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            IPrincipal user = httpContext.User;

            if (!user.Identity.IsAuthenticated)
            { 
               //? 
            }

            //Need to return json somehow ?
        }
    }

Как мне вернуть результат json из такого атрибута? есть идеи?

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

1 способ переопределить AuthorizeAttribute.HandleUnauthorizedRequest

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    throw new CustomUnauthorizedException();
}

... А потом в вашем Global.asax:

protected void Application_Error(object sender, EventArgs e)
{
    Exception error = Server.GetLastError();
    if (error is CustomUnauthorizedException) {
        if (AjaxRequest(Request)) {
            ... return Json response.
        } else {
            ... redirect
        }
    }
}

Таким образом, вы можете выбросить исключение в любом месте вашей кодовой базы, и вы централизовали обработку этого исключения в Global.asax

3 голосов
/ 09 августа 2011

Вы можете использовать ActionFilterAttribute, который позволяет вам вернуть результат, не используя httpcontext.response.write или что-либо еще.

public class JsonActionFilterAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (!HttpContext.Current.User.Identity.IsAuthenticated) {
            filterContext.Result = new JsonResult() { Data = "Need to login." };
        }
        base.OnActionExecuting(filterContext);
    }
}
0 голосов
/ 13 октября 2018

Попробуй это .. у меня работает

 protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
 {
   dynamic ResponseObj = new JObject();
   ResponseObj.Message = "Authorization has been denied for this request.";
   string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(ResponseObj);
   actionContext.Response = new HttpResponseMessage
    {
      StatusCode = HttpStatusCode.Unauthorized,
      Content = new StringContent(jsonString, System.Text.Encoding.UTF8,"application/json")
     };
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...