Я создаю серверное приложение 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 в свой запрос, но это не помогло (я пытался загрузить изображение, но моя компания, очевидно, блокирует это).
После изучения проблемы использование 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);
Результат испытаний
Привет @Деннис, не могли бы вы создать новый образец, который сможет воспроизвести для меня проблему? Пожалуйста, скройте свою конфиденциальную информацию, а также поделитесь подробными инструкциями, большое спасибо.
Привет @Джейсон. Поэтому я создал два проекта: серверное приложение Blazor и консольное приложение. Для серверного приложения Blazor все, что я сделал, — это создал приложение, ориентированное на .NET 6.0, выбрав проверку подлинности Windows в мастере проекта. Затем я добавил пустой контроллер API с одним простым методом HttpGet, который только что возвращал IActionResult OK (тестовая строка). Это все, что я сделал для приложения Blazor. Что касается консольного приложения, я также создал его для .NET 6.0. Я создал класс, который предоставил метод, показанный в моем исходном сообщении, добавив в него файл UseDefaultCredentials. Затем я добавил код в программу для его запуска.
Если вы скажете мне, как получить код, я пришлю то, что у меня есть. Но я мало что сделал. Как раз то, что я подробно описал выше. Я пробовал работать в режиме IIS Express и режиме проекта из VS. Тот же результат в обе стороны.
Привет @Деннис, извини за задержку. Не могли бы вы создать для меня новый образец проверки? И расскажите нам, как воспроизвести проблему и ожидаемое поведение, кстати, не забудьте скрыть свою конфиденциальную информацию, спасибо.
Привет @Джейсон. На самом деле я работал над этим вчера вечером и думаю, что понял проблему. Шаблоны проектов VS Blazor не настраивают автоматически все, что вам нужно настроить в Program.cs, если вы хотите иметь возможность создать контроллер для доступа. Мне пришлось вручную добавить строки UseControllers и MapControllers в мой Program.cs. Это устранило проблему в моем быстром примере проекта. Я собираюсь опробовать это на своем реальном проекте сегодня или завтра, и если это сработает, я опубликую это в качестве ответа. Спасибо!
Оказывается, я просто пропустил строку в моем Program.cs. Шаблон проекта Blazor не настраивает автоматически все необходимое для предоставления контроллеров с вашего сайта, как это делает шаблон WebAPI. Вам необходимо убедиться, что вы добавили builder.Services.AddControllers() и app.MapControllers() вручную в свой Program.cs. В моем случае я действительно добавил builder.Services.AddControllers(), но забыл добавить app.MapControllers(). Теперь все работает.
Спасибо за ответ! К сожалению, это не решило проблему для меня.