почему blazor webassembly необходимо авторизовать для отображения данных?

#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 с named HttpClient

Ответ №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 с уважением, что касается решения.