Невозможно точно помочь вам без фактического исключения. Однако следующая строка кричит «ошибка»:
if (author.Id != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
У вас есть потенциал NullReferenceException
, FormatException
и ArgumentNullException
, все из этой одной линии.
Во-первых, ни ваш контроллер, ни действие не украшены атрибутом Authorize
, и вы не предоставили никакой информации о запросе, который вы делаете, и о том, используете ли вы даже что-то вроде заголовка Authorization
с этим, ни с тем, правильно ли вы настроили аутентификацию в Startup.cs
, чтобы использовать это, не так ли? Скорее всего, есть вероятность, что на самом деле не существует принципала пользователя, от которого можно получить претензию.
Каждый раз, когда у вас есть что-то, что может быть нулевым (например, возвращение из User.FindFirst
), вы должны выполнить проверку на ноль. Это может быть фактический оператор if
или троичный, нуль-слияние (??
) или более новый нуль-условный (?.
). В противном случае, если вы попытаетесь получить доступ к члену из экземпляра, который оказывается пустым, вы получите NullReferenceException
. Для этого на самом деле лучшее, что вы можете сделать, это просто использовать User.FindFirstValue
вместо этого, что устраняет необходимость разыменования элемента Value
впоследствии.
Далее, если возвращаемое значение FindFirstValue
заканчивается null
, int.Parse
выдает ArgumentNullException
, поскольку вы не можете разобрать null
в int
. В результате вам нужно убедиться, что значение не равно нулю, прежде чем вызывать это.
Тогда, если идентификатор на самом деле не является чем-то, что может быть проанализировано в int
, как, например, GUID, вы в конечном итоге выбросите FormatException
. Вы можете знать, что это int, но вы всегда должны защищать свой код от возможных изменений в будущем. Когда вам нужно проанализировать строку в int (или в любом другом примитивном типе), вы всегда должны использовать TryParse
:
if (int.TryParse(myString, out int i)
{
// you can now use `i` as the parsed int for whatever you need
}
Короче говоря, это гораздо лучший способ написать эту строку кода:
if (!int.TryParse(User.FindFirstValue(ClaimTypes.NameIdentifier), out int id) || author.Id != id)
return Unauthorized();
По сути, это говорит о том, что если значение заявки равно нулю / не может быть проанализировано как int или не совпадает с идентификатором автора, то возвращает Unauthorized()
.