Почему возникает ошибка System.InvalidOperationException: No authentication handler is registered for the scheme?

У вас возникает ошибка "System.InvalidOperationException: No authentication handler is registered for the scheme 'A company with such a number, website, or phone number exists.'. The registered schemes are: Bearer. Did you forget to call AddAuthentication().Add[SomeAuthHandler]("A company with such a number, website, or phone number exists.",...)?", когда вы вызываете метод Forbid. Как можно решить эту проблему? <br/> <br/> <pre><code class="cs">[ApiController]
[Route("/api/delivery-company")]
public class DeliveryCompanyController(
    ILogger&lt;DeliveryCompanyController&gt; logger,
    DeliveryCompanyService service,
    IMapper mapper)
    : ControllerBase
{
    private readonly ILogger&lt;DeliveryCompanyController&gt; _logger = logger;

    [HttpPost, ValidationFilter, AnonymousOnly]
    public async Task&lt;IActionResult&gt; Create([Required, FromForm] DeliveryCompanyCreateQuery query)
    {
        var phoneNumber = PhoneNumberValueObject.Create(query.PhoneNumber);
        
        if (Uri.TryCreate(query.WebSite, new UriCreationOptions(), out Uri? webSite)
            &amp;&amp; phoneNumber is not null)
        {
            var foundCompany = await service.GetByAnyParam(query.Name, webSite, phoneNumber);

            if (foundCompany is not null)
                return Forbid("A company with such a number, website, or phone number exists.");
        
            var newCompany = mapper.Map&lt;DeliveryCompanyEntity&gt;(query);
            await service.Add(newCompany);

            return Ok();
        }
        return BadRequest("Not a valid web site and/or phone number");
    }
}</code></pre> <br/> <br/> В Program: <br/> <pre><code class="csharp">builder.Services.AddAuthentication(auth =&g
  • 27 сентября 2024 г. 10:43
Ответы на вопрос 2
Ошибка `System.InvalidOperationException: No authentication handler is registered for the scheme 'A company with such a number, website, or phone number exists.'` возникает из-за того, что метод `Forbid()` ожидает наличие схемы аутентификации, которая не была зарегистрирована в вашем приложении. По умолчанию, когда вы вызываете `Forbid()`, ASP.NET Core предполагает, что вы хотите использовать аутентификацию, основанную на определенной схеме, такой как "Bearer".

Код, который вы предоставили, показывает, что вы пытаетесь использовать `Forbid()` с сообщением, которое не является схемой аутентификации. Вместо этого, если вы хотите вернуть ошибку с определенным сообщением, вам следует использовать другой подход.

Вот некоторые возможные решения для устранения этой проблемы:

### 1. Используйте `Conflict()` вместо `Forbid()`

Если вы хотите сообщить о конфликте, вы можете использовать метод `Conflict()`, который возвращает HTTP статус 409:

```csharp
if (foundCompany is not null)
    return Conflict("A company with such a number, website, or phone number exists.");
```

### 2. Используйте `BadRequest()` с сообщением

Если причина запрета связана с неправильными данными, вы можете использовать метод `BadRequest()`:

```csharp
if (foundCompany is not null)
    return BadRequest("A company with such a number, website, or phone number exists.");
```

### 3. Убедитесь в корректной аутентификации (если это необходимо)

Если вызов `Forbid()` все же предполагается в вашем коде (например, для защиты определенных ресурсов), убедитесь, что вы правильно настраиваете схемы аутентификации в `Startup` или `Program`:

```csharp
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; // или ваша схема
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    // Настройка параметров JWT
});
```

### Пример

Пример использования `Conflict()` и `BadRequest()` так будет выглядеть в вашем методе:

```csharp
if (foundCompany is not null)
    return Conflict("A company with such a number, website, or phone number exists.");
```

или

```csharp
if (foundCompany is not null)
    return BadRequest("A company with such a number, website, or phone number exists.");
```

Часто использование `BadRequest()` более уместно, так как предполагается, что проблема возникла при обработке запроса. Используйте тот вариант, который лучше всего подходит для вашей логики приложения.
Вы неправильно используете метод ControllerBase.Forbid.  Передаваемая в него строка (она, как понимаю, преобразуется в массив строк из одного элемента)  - это не сообщение об ошибке, а название использованного метода аутентификации.
Похожие вопросы