Серверное приложение Blazor с проверкой подлинности Windows получает ошибку 401 неавторизованно

Я создаю серверное приложение Blazor для внутреннего использования в компании и использую аутентификацию Windows. Приложение должно получать обновления из другого приложения через открытый контроллер. Я пытаюсь протестировать контроллер и получаю неавторизованную ошибку 401, однако пытаюсь его поразить (Почтальон, браузер, тестовое консольное приложение, из самого серверного приложения Blazor и т. д.). Я использую .NET 6 и создал приложение с помощью Visual Studio и выбрав проверку подлинности Windows в мастере создания проекта для серверного приложения Blazor. Я запускаю приложение из Visual Studio, используя опцию IIS Express. Вот простой тест, который я настроил в консольном приложении, просто пытаясь получить положительный ответ от контроллера:

public async Task<int> GetUpdateTestTimerResult()
{
    var client = new HttpClient();
    client.BaseAddress = new Uri("http://localhost:40871");
    var url = "api/updateTest";

    var value = await JsonSerializer.DeserializeAsync<int>
            (await client.GetStreamAsync(url), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
    return value;
}

Я попытался установить атрибут AllowAnonymous на контроллере, но ничего не получилось. Как предоставить доступ к контроллеру, который позволит внешнему приложению (также внутреннему для компании/локальному) доступ?

Обновлено: согласно Джейсону (см. ниже). Я попытался добавить UseDefaultCredentials в свой запрос, но это не помогло (я пытался загрузить изображение, но моя компания, очевидно, блокирует это).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
195
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

После изучения проблемы использование UseDefaultCredentials поможет нам решить проблему.

        HttpClientHandler handler = new HttpClientHandler()
        {
            UseDefaultCredentials = true
        };
        var client = new HttpClient(handler);
        client.BaseAddress = new Uri("http://localhost:8008/");
        var url = "error?handler=api";

        var response = await client.GetAsync(url);
        return new JsonResult(response);

Результат испытаний

Спасибо за ответ! К сожалению, это не решило проблему для меня.

Dennis 07.05.2024 14:41

Привет @Деннис, не могли бы вы создать новый образец, который сможет воспроизвести для меня проблему? Пожалуйста, скройте свою конфиденциальную информацию, а также поделитесь подробными инструкциями, большое спасибо.

Jason Pan 07.05.2024 14:48

Привет @Джейсон. Поэтому я создал два проекта: серверное приложение Blazor и консольное приложение. Для серверного приложения Blazor все, что я сделал, — это создал приложение, ориентированное на .NET 6.0, выбрав проверку подлинности Windows в мастере проекта. Затем я добавил пустой контроллер API с одним простым методом HttpGet, который только что возвращал IActionResult OK (тестовая строка). Это все, что я сделал для приложения Blazor. Что касается консольного приложения, я также создал его для .NET 6.0. Я создал класс, который предоставил метод, показанный в моем исходном сообщении, добавив в него файл UseDefaultCredentials. Затем я добавил код в программу для его запуска.

Dennis 07.05.2024 19:36

Если вы скажете мне, как получить код, я пришлю то, что у меня есть. Но я мало что сделал. Как раз то, что я подробно описал выше. Я пробовал работать в режиме IIS Express и режиме проекта из VS. Тот же результат в обе стороны.

Dennis 07.05.2024 19:38

Привет @Деннис, извини за задержку. Не могли бы вы создать для меня новый образец проверки? И расскажите нам, как воспроизвести проблему и ожидаемое поведение, кстати, не забудьте скрыть свою конфиденциальную информацию, спасибо.

Jason Pan 21.05.2024 15:14

Привет @Джейсон. На самом деле я работал над этим вчера вечером и думаю, что понял проблему. Шаблоны проектов VS Blazor не настраивают автоматически все, что вам нужно настроить в Program.cs, если вы хотите иметь возможность создать контроллер для доступа. Мне пришлось вручную добавить строки UseControllers и MapControllers в мой Program.cs. Это устранило проблему в моем быстром примере проекта. Я собираюсь опробовать это на своем реальном проекте сегодня или завтра, и если это сработает, я опубликую это в качестве ответа. Спасибо!

Dennis 23.05.2024 14:42
Ответ принят как подходящий

Оказывается, я просто пропустил строку в моем Program.cs. Шаблон проекта Blazor не настраивает автоматически все необходимое для предоставления контроллеров с вашего сайта, как это делает шаблон WebAPI. Вам необходимо убедиться, что вы добавили builder.Services.AddControllers() и app.MapControllers() вручную в свой Program.cs. В моем случае я действительно добавил builder.Services.AddControllers(), но забыл добавить app.MapControllers(). Теперь все работает.

Другие вопросы по теме