0

Я написал пользовательский Авторизоваться Фильтр:Изменение ModelState при неудачной авторизации

public class MyAuthenticationAttribute : FilterAttribute, IAuthorizationFilter{ 

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

Этот фильтр имеет различные условия, и в конце концов установит результат Unauthorized, если пользователь не имеет права и не будет делать ничего, если пользователь авторизован.

Он используется в приложении SPA, и почти все мои методы вызывают из сеток. В этих сетках у меня есть собственный обработчик ошибок, который будет показывать дружественные уведомления, если что-то пойдет не так. Все ошибки добавляются к ModelState.

Теперь я хотел бы управлять неавторизованным поведением и изменять ModelState, когда пользователь не уполномочен делать, например, удаление.

Просьба указать, как мне его реализовать и какие методы мне нужно переопределить.

UPDATE

я могу изменить состояние модели этой линии:

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?

ответ

0

Вы можете вернуть любой результат, который вы хотите с помощью context.Result, в моем случае, я хотел бы, чтобы отменить изменения кендо 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() 
      } 
     }; 
    } 
} 
Смежные вопросы