Получение данных из тела в промежуточном программном обеспечении авторизации - PullRequest
1 голос
/ 16 января 2020

У меня такой же вопрос, как и введите описание ссылки здесь : если я хочу обновить объект (отправленный в теле PUT), который содержит идентификатор, как я могу получить этот идентификатор в промежуточное программное обеспечение без отправки этого идентификатора в данных маршрута?

Пример: задан объект:

myObject= new MyObject
{
   id = 1,
   string "blah blah blah"
}

пользователь, у которого есть права на обновление MyObject с id = 3 и у которого НЕТ ПРАВА ОБНОВЛЕНИЯ на MyObject с id = 1 использует Почтальон для отправки PUT с маршрутом /api/values/3 и телом myObject. Промежуточное программное обеспечение авторизации будет одурачено id = 3 и позволит пользователю изменить неправильный объект.

Конечно, я мог бы добавить в updateMethod проверку (if (myObjectId != myObject.id) ...) или я мог бы удалить идентификатор из MyObject, но оба решения кажутся слишком большими усилиями для такого крайнего случая. Самый простой способ - это проверить действительные данные в промежуточном программном обеспечении.

Есть ли способ сделать это? Есть ли лучший подход, который я не рассматривал? спасибо!

1 Ответ

1 голос
/ 17 января 2020

Я хочу обновить объект (отправленный в теле PUT), который содержит идентификатор, как я могу получить этот идентификатор в промежуточном программном обеспечении без отправки этого идентификатора в данных маршрута?

Выполнить указанное выше требование в промежуточном программном обеспечении / фильтре авторизации, считывая данные публикации MyObject из тела запроса, легко, но это не помогает нам записывать измененные данные MyObject обратно в тело запроса.

Если возможно, вы можете попытаться добиться этого в фильтре действий, как показано ниже.

public void OnActionExecuting(ActionExecutingContext context)
{
    if (context.HttpContext.Request.Path.StartsWithSegments(new Microsoft.AspNetCore.Http.PathString("/api/values")))
    {
        var user = context.HttpContext.User;

        //code logic here


        //check if request from client contains id in route data
        var routeData = context.HttpContext.Request.RouteValues;


        //update value of MyObject Id property based on your requirement 
        object myObject;

        if (context.ActionArguments.TryGetValue("myObject", out myObject))
        {
            MyObject _myobject = myObject as MyObject;

            _myobject.Id = 3;
        }
    }
}
...