Как передавать данные в контроллер??
Думаю, что проблема вJSON.stringify(books)
т.к. по сути этой строкой Вы отправляете string, а не объект. Несовпадение типа, он его и не видит.
Если хотите в методе объект принять, не нужно его к строке преобразовывать, можно простоdata: books,
Но что-то мне подсказывает, что в Вашем варианте и здесь могут быть проблемы. Зачем Вы принимаете JObject?
Преобразуете его потом, примите его как есть массивом public async Task<JsonResult> Settings(object[] books)
А еще лучше, типизируйте как положено, ну а затем сделаете что-то вроде JObject.FromObject(books).
PS: а метод Settings возвращает ошибку не выполняя метод.
В таких случаях хорошо бы и текст ошибки к вопросу прикладывать.
1. Вы вызываете метод Password в первом случае.
2. В параметрах методов контроллеров должна быть модель данных которые передаете, типаclass Book
{
 public string Name {get; set;}
 public int Price {get; set;}
}

 public async Task<IActionResult> Settings([FromBody] Book[] books)
{
return Ok()
}
3. RestApi строится не таким образом, в контроллере должны быть методы которые отвечают за CRUD операции и соответственно выполняются разными типами запросов, GET - выборка данных, POST - добавление данных, PUT - Модификация, DELETE - удаление. И один контроллер отвечает за работу только с одним типом данных, те если у вас UsersController, то работа идет только с типом Users, 
4. Возвращайте из контроллера IActionResult, У контроллера есть несколько методов типа Ok, BadRequest, NotFound, NoContent. Соответственно они устанавливают статус ответа (200,404 и т.д.), что вам понадобится для обработки ошибок 
5. Вот как пример контроллера RestAPI - https://pastebin.com/PykpEGWP, те если у вас методы контроллера должны отправлять и принимать только тип User и с клиента отправляете только его.