Изменение ModelState при сбое авторизации

Я написал собственный фильтр авторизации:

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 данных?


person Akbari    schedule 29.08.2015    source источник


Ответы (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()
            }
        };
    }
}
person Akbari    schedule 30.08.2015