Используйте дженерики.
public class SomeBinder<TConcreteType> : IModelBinder
{
}
Тогда ваша подпись становится
public ActionResult InterfaceWithInlineImplementation(
[ModelBinder(typeof(SomeBinder<SomeInterfaceImpelemtation_One>))]ISomeInterface SomeInterface)
Тогда десериализация будет:
JsonConvert.DeserializeObject<TConcreteType>(json)
Однако, исходя из вашего последнего комментария, звучит так, как будто вам просто нужно Предотвратить перепост вместо этой запутанной привязки модели.
Итак, предположим, что клиент знает, что у реализации сервера есть методы безопасности, и пытается сопоставить сигнатуру, надеясь, что все, к примеру, будет десериализировано. Ясно, что вы ожидаете. И вы явно ожидаете только определения контракта и ничего более.
Выдержка:
Массовое присвоение обычно происходит во время связывания модели как часть MVC. Простой пример: на вашем веб-сайте есть форма, в которой вы редактируете некоторые данные. У вас также есть некоторые свойства в вашей модели, которые нельзя редактировать как часть формы, но вместо этого они используются для управления отображением формы или могут вообще не использоваться.
public class UserModel
{
public string Name { get; set; }
public bool IsAdmin { get; set; }
}
Таким образом, идея заключается в том, что вы визуализируете только один входной тег для разметки, но отправляете его в метод, который использует ту же модель, что и для визуализации:
[HttpPost]
public IActionResult Vulnerable(UserModel model)
{
return View("Index", model);
}
Однако, с помощью простых манипуляций с HTML или с помощью Postman / Fiddler, злоумышленник может установить для поля IsAdmin значение true. Связыватель модели должным образом свяжет значение, и вы только что стали жертвой массового назначения / повторного размещения:
Так как вы можете предотвратить эту атаку? К счастью, существует целый ряд различных способов, и они, как правило, совпадают с подходами, которые вы могли использовать в предыдущей версии ASP.NET. Здесь я рассмотрю ряд ваших вариантов.
Перейти к статье ...