Вызов WebAPI с авторизацией со стороны сервера blazor

#authorization #blazor #server-side #webapi

#авторизация #blazor #на стороне сервера #webapi

Вопрос:

Прошу прощения, если это немного глупый вопрос — я пытаюсь разобраться в настройке безопасности и не имею большого опыта в этой области. Читал столько, сколько мог, но не могу найти четкий пример того, что я пытаюсь сделать.

Я создал проекты blazor на стороне сервера и wasm по умолчанию из шаблонов Visual Studio и предоставил общий доступ к проекту wasm, чтобы я мог повторно использовать как на стороне клиента, так и на стороне сервера в соответствии со статьей Карла Франклина:

http://www.appvnext.com/blog/2020/2/2/reuse-blazor-wasm-ui-in-blazor-server

Все работает нормально.

Далее, я повторяю, но добавляю опцию «Индивидуальные учетные записи пользователей» в оба проекта при создании, устанавливайте строку db в общую базу данных идентификации. Оба работают по отдельности, однако, когда я предоставляю общий доступ к клиентскому коду и вызываю из blazor на стороне сервера, вызов webapi завершается ошибкой «несанкционированный».

Итак, короче говоря, я успешно вхожу в проект blazor на стороне сервера. Сбой происходит, когда я пытаюсь вызвать webapi, который теперь находится в отдельном проекте (проект WASM) и поэтому будет выполняться в другом домене (не думаю, что я пока сталкиваюсь с проблемами cors). Когда я пытаюсь вызвать webapi, я получаю несанкционированную ошибку. Когда я запускаю в WASM, все работает так, как ожидалось.

Может кто-нибудь, пожалуйста, указать мне, какие шаги мне нужно предпринять, чтобы это заработало? Полный код для компонента razor приведен ниже…

 @page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using BlazorWasm.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
        {
            string url = "https://localhost:44378/WeatherForecast";
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>(url);
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
        catch(HttpRequestException exception)
        {
            string msg = exception.Message;
        }
    }

}