Следующие фрагменты кода предоставляют способ получения токена доступа, выданного при аутентификации пользователя с поставщиком IdentityServer4. Чтобы получить токен доступа, вы можете использовать объект HttpContext, но поскольку Blazor основан на SignalR, вам придется делать это только тогда, когда доступен объект HttpContext, когда соединение с вашим приложением является HTTP-соединением, и не соединение WebSocket.
После получения токена доступа его необходимо передать в приложение Blazor и сохранить в локальном хранилище. Мой код также позволяет при необходимости анализировать маркер доступа.
Добавить файл в папку «Страницы» и назвать его _Host.cs html .cs
Добавьте этот код в файл:
public class HostAuthenticationModel : PageModel
{
public async Task<IActionResult> OnGet()
{
if (User.Identity.IsAuthenticated)
{
var token = await HttpContext.GetTokenAsync("access_token");
AccessToken = token;
}
return Page();
}
public string AccessToken { get; set; }
}
Примечание: я назвал класс PageModel: HostAuthenticationModel. Вам понадобятся некоторые из них:
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System;
using System.Linq;
using System.Threading.Tasks;
- Затем мы должны передать значение, сохраненное в свойстве AccessToken, в приложение Blazor:
В файле _Host.cs html добавить директиву модели в верхней части файла:
@model HostAuthenticationModel
Добавьте новый атрибут к компоненту Tag Helper следующим образом:
param-AccessToken="Model.AccessToken"
Окончательный результат:
<app>
<component type="typeof(App)" render-mode="ServerPrerendered"
param-AccessToken="Model.AccessToken"/>
</app>
Атрибут param-AccessToken
требует, чтобы вы задали свойство с именем AccessToken в компоненте приложения , которое будет получать токен доступа из модели страницы.
- Далее определить свойство, которое будет получать токен доступа
, а затем переопределить метод OnAfterRenderAsyn c из w Мы вызываем метод для хранения токена доступа в локальном хранилище.
@code{
[Parameter]
public string AccessToken { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await tokenStorage.SetTokenAsync(AccessToken);
}
}
}
Также поместите следующее в верхней части компонента приложения:
@inject AccessTokenStorage tokenStorage
Затем вам нужно будет создать Служба AccessTokenStorage, например:
Создайте класс с именем AccessTokenStorage в root вашего приложения и добавьте следующий код:
publi c class AccessTokenStorage { только для чтения IJSRuntime _jsRuntime;
public AccessTokenStorage(IJSRuntime jsRuntime)
{
_jsRuntime = jsRuntime;
}
public async Task<string> GetTokenAsync()
=> await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "accessToken");
public async Task SetTokenAsync(string token)
{
if (token == null)
{
await _jsRuntime.InvokeAsync<object>("localStorage.removeItem",
"accessToken");
}
else
{
await _jsRuntime.InvokeAsync<object>("localStorage.setItem",
"accessToken", token);
}
}
}
Я думаю, здесь не требуется никаких объяснений ... Вот некоторые директивы использования, которые могут вам понадобиться
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.JSInterop;
Добавьте следующее в Startup.ConfigureServices
services.AddHttpClient();
services.AddScoped<AccessTokenStorage>();
Примечание: вышеуказанный код должен использоваться с кодом, который я предоставляю в моем ответе здесь