#c# #blazor #blazor-webassembly
#c# #blazor #blazor-webassembly
Вопрос:
Я создал веб-сборку Blazor по умолчанию с хостингом aspcore (шаблон по умолчанию) и аутентификацией под индивидуальной учетной записью пользователя. но у меня проблема, я хочу показать FetchData.razor
компонент данных для анонимного пользователя. по умолчанию пользователь должен войти на веб-сайт, чтобы просмотреть FetchData.razor
содержимое компонента.
Я меняю все атрибуты [Authorize] на [AllowAnonymous]
component и web api, даже удаляю все [Authorize]
атрибуты (в компоненте и веб-api). но все же перейдите к перенаправлению на страницу входа.
Компонент:
using blazorAuten.Shared;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace blazorAuten.Server.Controllers
{
// [Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
this.logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
fetchdata
контроллер api:
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using blazorAuten.Shared
@*@attribute [Authorize]*@
@inject HttpClient Http
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}
}
как вы можете видеть, все [Authorize]
атрибуты являются комментариями. даже проверка с помощью [AllowAnonymous]
дает тот же результат.
даже в App.Razor
компоненте я комментирую <RedirectToLogin />
компонент. но все равно, когда я захожу в fetchdata
компонент, перенаправляю на страницу входа:
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
@if (!context.User.Identity.IsAuthenticated)
{
@*<RedirectToLogin />*@
}
else
{
<p>You are not authorized to access this resource.</p>
}
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
итак, если я хочу показать данные из api анонимным пользователям (гостевым пользователям, которые впервые посещают веб-сайт), что мне делать? все посетители веб-сайта должны входить в систему? все данные из api (сервера) должны авторизовываться пользователем?
Ответ №1:
У меня есть это приложение.razor, и оно работает для меня :
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
<Authorizing>
<PageLoading Information="Authentication in progress" />
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<CascadingAuthenticationState>
<LayoutView Layout="@typeof(MainLayout)">
<PageNotFound />
</LayoutView>
</CascadingAuthenticationState>
</NotFound>
</Router>
У вас HttpClient
не должно быть AuthorizationMessageHandler
.
Комментарии:
1. Я меняю
App.razor
на это, но все равно перенаправляю на страницу входа (тот же результат).2. вы удалили атрибут авторизации?
3. Вам нужен
HttpClient
безBaseAddressAuthorizationMessageHandler
4. Нет, этот обработчик используется для извлечения токена доступа из хранилища сеанса и заполнения заголовка авторизации. Если пользователь не аутентифицирован, попробуйте войти в систему.
5. Если вам нужны 2
HttpClient
, один для анонимных конечных точек и один для авторизованных конечных точек, тогда рассмотрите возможность использования HttpClientFactory с namedHttpClient
Ответ №2:
У меня была такая же проблема, просто найдите раздел «Не прошедшие проверку подлинности или неавторизованные запросы web API в приложении с защищенным клиентом по умолчанию» на https://learn.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/additional-scenarios?view=aspnetcore-3.1#unauthenticated-or-unauthorized-web-api-requests-in-an-app-with-a-secure-default-client с уважением, что касается решения.