Веб-API .NET Core 3.1 и аутентификация JWT на стороне сервера Blazor

Я хотел бы понять, как можно настроить JWT аутентификацию для серверных приложений Blazor?

Приведу пример. Допустим, у нас есть проект веб-API .NET Core 3.1. В проекте есть собственная TokenController реализация, которая выдает JWT за действительную комбинацию пользователя и пароля. Все остальные контроллеры требуют такой токен для каждого запроса.

ПО промежуточного слоя для проверки аутентификации настроено следующим образом:

// enabling JWT bearer scheme
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => 
    {
        options.TokenValidationParameters = new TokenValidationParameters 
        {
            // TOKEN VALIDATION PARAMETERS
        };
    });

// applying default authentication policy
services.AddMvc(o => 
{
    o.EnableEndpointRouting = false;
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    o.Filters.Add(new AuthorizeFilter(policy));
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

До сих пор это работает отлично.

Теперь я хотел бы добавить в этот проект красивый пользовательский интерфейс на стороне сервера Blazor, и я просто не могу понять, как тогда выполнить аутентификацию?

Согласно Microsoft Docs, аутентификация для серверных приложений должна происходить при установлении соединения SignalR:

Аутентификация сервера Blazor

Приложения Blazor Server работают через соединение в реальном времени, созданное с помощью SignalR. Аутентификация в приложениях на основе SignalR обрабатывается при установке соединения. Аутентификация может быть основана на файле cookie или другом токене-носителе.

(источник: https://docs.microsoft.com/en-us/aspnet/core/security/blazor/?view=aspnetcore-3.1&tabs=visual-studio)

К сожалению, я не могу понять, как это работает - уроки и советы, которые я нашел, предназначены либо для Client Side Blazor, либо для использования Cookie / Identity ...

Любые идеи?


person ilsanker    schedule 25.03.2020    source источник
comment
Я надеюсь, что кто-то сможет ответить на этот вопрос, так как я тоже искал ответ. Я знаю, что некоторые говорят, что используют localstorage ... но я думаю, что на стороне сервера Blazor должен быть лучший вариант.   -  person CF-Slayer    schedule 06.05.2020
comment
Это тоже сводит меня с ума - нигде нет буквально ничего полезного!   -  person Robert Perry    schedule 10.06.2020
comment
Я также ищу это: если мы защищаем проект WebApi собственной аутентификацией, то как приложение Blazor Server интегрируется с контроллерами WebApi, имея при этом свой собственный, основанный на SignalR?   -  person Tim    schedule 31.07.2020


Ответы (1)


Я настроил Blazor Server с аутентификацией, а затем добавил аутентификацию JWT для API. Так что я думаю, что это то же самое в обратном направлении.

Вот что я сделал:

В Startup.cs

ConfigureServices метод (думаю, порядок может иметь значение, не уверен):

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

// not sure if this line is required for Blazor auth
services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>();

services.AddAuthentication()
    .AddCookie(cfg => cfg.SlidingExpiration = true)
    .AddJwtBearer(x =>
    {
        // options
    });

Для страниц Blazor

// SamplePage.razor.cs
[Route("page-path")]
[Authorize]
public partial class SamplePage
{ }

// or like this in SamplePage.razor
@page "page-path"
@attribute [Authorize]

Для контроллера API

[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class SampleController : ControllerBase
{ }

Я нашел содержимое этой страницы очень полезным для того, чтобы заставить JWT работать после того, как я начал работу над серверным проектом Blazor. https://jasonwatmore.com/post/2019/10/11/aspnet-core-3-jwt-authentication-tutorial-with-example-api

person TimB    schedule 11.08.2020
comment
В конце тега авторизации в API-контроллере отсутствует скобка, но это то, что мне было нужно, и работало как шарм! Аутентификация сервера идентификации для страниц и JWT для API. Спасибо! - person Michelh91; 23.01.2021
comment
@ Michelh91 спасибо, исправил это сейчас - person TimB; 24.01.2021