Веб-сборка Blazor использует API из http.sys с проверкой подлинности Windows в результате несанкционированного доступа.

Я запускаю клиентский blazor wasm на https: // localhost:5001 / и сервер API, размещенный с http.sys на https: // localhost:44302 /. Я установил аутентификацию Windows для http.sys, как описано здесь https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-5.0&tabs=visual-studio#httpsys

Теперь, когда я использую HttpClient на Blazor wasm и достигая контроллера или концентратора с помощью [Авторизовать], я мгновенно получаю Неавторизованный.

      crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Response status code does not indicate success: 401 (Unauthorized).
System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized) with exception
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync(Uri url, HttpClient httpClient, ILogger logger, CancellationToken cancellationToken)

Я хотел бы знать, почему при этой настройке нет всплывающего диалогового окна с настройкой учетных данных.

Напротив, когда у меня Blazor wasm размещен в IIS, он работает так, что появляется всплывающее окно входа в браузер.

Большое вам спасибо за ваши ответы.

1 ответ

Я решил это. Итак, в основном проблема заключается в отправляемом запросе.

Решение 1. Добавьте вручную для каждого запроса BrowserRequestCredentials.Include

      var httpRequest = new HttpRequestMessage();
        
httpRequest.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

Решение 2. Создайте ссылку на обработчик делегирования здесь https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/signalr?view=aspnetcore-5.0&pivots=webassembly

          public class IncludeRequestCredentialsMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
            return base.SendAsync(request, cancellationToken);
        }
    }

а затем в вашем Program.cs зарегистрируйте его в DI

      builder.Services.AddHttpClient("API", client => client.BaseAddress = new Uri("YOUR URL"))
            .AddHttpMessageHandler(s => new IncludeRequestCredentialsMessageHandler());

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
                .CreateClient("API"));
Другие вопросы по тегам