Майкрософт.Идентификация.Веб- и ASP.NET Аутентификация Core SignalR JWT

#azure #asp.net-core #signalr

#azure #asp.net-ядро #signalr

Вопрос:

Я использую ASP.NET Ядро для создания веб-приложения, которое также использует SignalR Core для обеспечения функциональности в реальном времени. Я использую Azure AD B2C для управления пользователями. Я успешно использовал Microsoft.Identity.Web (https://github.com/AzureAD/microsoft-identity-web ) для защиты моих конечных точек API с помощью токенов, сгенерированных Azure AD B2C.

Я хотел бы сделать то же самое для своих основных узлов SignalR. В документации указано, чтобы добавить соответствующую аннотацию к вашим концентраторам / методам, что я и сделал. Библиотека SignalR на стороне клиента добавляет токен доступа в качестве параметра запроса, который должен быть извлечен и добавлен в контекст вручную в конфигурации вашего ASP.NET основное приложение, вот так.

     services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                var accessToken = context.Request.Query["access_token"];

                // If the request is for our hub...
                var path = context.HttpContext.Request.Path;
                if (!string.IsNullOrEmpty(accessToken) amp;amp;
                    (path.StartsWithSegments("/hubs/chat")))
                {
                    // Read the token out of the query string
                    context.Token = accessToken;
                }
                return Task.CompletedTask;
            }
        };
    });
 

Однако это, по-видимому, несовместимо с конфигурацией, предоставленной Microsoft.Identity.Web здесь:

         services
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));
 

Как я могу заставить SignalR работать с Microsoft.Identity.Web ?

Комментарии:

1. Джесси, я совершенно не понимаю, чего ты пытаешься достичь. Это происходит в обход Microsoft. Identity.Web. Зачем вам нужен токен доступа, поступающий в ваш веб-API? У вас есть ссылка на документацию, которую вы упоминаете? Я хотел бы взглянуть на это (и, возможно, обновить его?), Если вы используете MIcrosoft. Идентификация. Web, просто используйте IDownstreamWebApi, GraphServiceClient или, например, запрос в вашем действии контроллера?

Ответ №1:

Это должно сделать это:

 services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(configuration);

services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
    Func<MessageReceivedContext, Task> existingOnMessageReceivedHandler = options.Events.OnMessageReceived;
    options.Events.OnMessageReceived = async context =>
    {
      await existingOnMessageReceivedHandler(context);

      StringValues accessToken = context.Request.Query["access_token"];
      PathString path = context.HttpContext.Request.Path;

      // If the request is for our hub...
      if (!string.IsNullOrEmpty(accessToken) amp;amp; path.StartsWithSegments("/hubs"))
      {
        // Read the token out of the query string
        context.Token = accessToken;
      }
    };
});
 

Вместо добавления JwtBearer вы можете настроить объект JwtBearerOptions таким образом.

Адаптировано из этой документации: https://github.com/AzureAD/microsoft-identity-web/wiki/customization

Комментарии:

1. Возможно, это не идеально, но оно отлично справляется с задачей, должно быть принято

2. О боже… Почти год спустя этот ответ мне очень помог, избавив меня от необходимости тратить еще одну неделю на попытки разобраться в этом, спасибо! Я не знал, была ли неисправна моя интерфейсная или серверная сторона, и оказалось, что ваше решение работает отлично, но для меня оно действительно сработало после некоторой настройки интерфейса. Я использовал его с Angular 13 и библиотекой «@azure / msal-angular», для тех, кто заинтересован.

Ответ №2:

Вы можете использовать Visual Studio для настройки подключения SignalR, а затем просто добавить эту строку в startup.cs (VS может добавить ее автоматически)

 services.AddSignalR().AddAzureSignalR();
 

В этом примере для разработчиков настроен SignalR, отсутствует только строка подключения, но может дать вам представление о том, что делать. Большая часть этого была выполнена автоматически с помощью VS. Если у вас возникли проблемы с ее настройкой, пожалуйста, откройте проблему в репозитории. Спасибо.