0

我写了一个自定义的授权过滤器:

public class MyAuthenticationAttribute : FilterAttribute, IAuthorizationFilter{

    // Do the authorization    
    if (!isAuthenticated)
    {
        filterContext.Result = new HttpUnauthorizedResult();
    }
}

这个过滤器有各种条件,如果用户没有被授权,最终将结果设置为Unauthorized,如果用户被授权,则什么也不做。

它在 SPA 应用程序中使用,我的几乎所有方法都是从网格中调用的。在这些网格中,我有自定义错误处理程序,如果出现问题,它将显示友好的通知。所有错误都添加到ModelState.

现在,我想管理未经授权的行为并ModelState在用户无权执行(例如删除)时进行更改。

请指导我应该如何实现它以及我需要覆盖哪些方法。

更新

我可以用这条线改变模型状态:

filterContext.Controller.ViewData.ModelState.AddModelError("", "GO AWAY!");

但它不会向用户返回任何内容。我已经尝试在挑战方法中使用IAuthenticationFilter和添加ModelState错误,但它也没有奏效。

如果我可以返回一些Json数据,我想它会正常工作。

我需要以某种方式获得此操作方法的类似行为:

public ActionResult Delete([DataSourceRequest] DataSourceRequest request, object model)
{
    ModelState.AddModelError("", "error");
    return Json(new[] { model}.ToDataSourceResult(request, ModelState));
}

可能吗?您对实施此授权和返回Json数据有什么建议吗?

4

1 回答 1

0

您可以使用返回任何您想要的结果context.Result,在我的情况下,我想取消 Kendo Grid 的更改并添加我使用此代码实现的模型状态错误:

public void OnAuthenticationChallenge(AuthenticationChallengeContext context)
{
    if (context.Result == null || context.Result is HttpUnauthorizedResult)
    {
        var ModelState = context.Controller.ViewData.ModelState;

        context.Result = new JsonResult
        {
            Data = new Kendo.Mvc.UI.DataSourceResult
            {
                Errors = ModelState.SerializeErrors()
            }
        };
    }
}
于 2015-08-30T03:56:26.180 回答