【问题标题】:Changing ModelState when authorization fails授权失败时更改 ModelState
【发布时间】:2015-11-23 20:17:35
【问题描述】:

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

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 数据有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-mvc-filters


    【解决方案1】:

    您可以使用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()
                }
            };
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2020-04-03
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多