Веб-сборка 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"));