#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;
}
}
}