Как я могу получить токен доступа из веб-приложения Blazor (на стороне сервера)? - PullRequest

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Следующие фрагменты кода предоставляют способ получения токена доступа, выданного при аутентификации пользователя с поставщиком 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>();

Примечание: вышеуказанный код должен использоваться с кодом, который я предоставляю в моем ответе здесь

0 голосов
/ 08 мая 2020

Я использовал следующий способ

Startup.cs

services.AddHttpContextAccessor();

Страница бритвы

@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Authentication
@inject IHttpContextAccessor httpContextAccessor


@code {    
    private async Task<string> GetToken()
            => await httpContextAccessor.HttpContext.GetTokenAsync("access_token");
}
...