Служба приложений Azure с веб-сокетами и аутентификацией AD - PullRequest
2 голосов
/ 01 июля 2019

мы получили приложение, развернутое как Служба приложений, и мы используем SignalR для связи.После включения аутентификации AAD - в браузерах мы начали получать 302 ответа с адресом перенаправления в Azure AD.

Похоже, что уровень аутентификации в службе приложений игнорирует access_token, переданный строкой запроса.

Запрос

Request URL: wss://<url>/hubs/chat?access_token=<token>
Request Method: GET

Ответ

Status Code: 302 Redirect
Location: https://login.windows.net/common/oauth2/authorize?...

Посмотрев повсюду, мы не смогли найти никакого решения для этой работы.Единственное решение этой проблемы, которое мы видим, это либо отключить аутентификацию в службе приложений, либо использовать Long-Pooling, но в нашем случае оба варианта неприемлемы.

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

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

using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;

namespace Stackoverflow.Example.Security.Middleware
{
    public class BearerTokenFromQueryToHeaderMiddleware
    {
        private readonly RequestDelegate _next;

        public BearerTokenFromQueryToHeaderMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            var token = context.Request.Query["access_token"];
            if (!string.IsNullOrWhiteSpace(token))
            {
                context.Request.Headers.Add("Authorization", $"Bearer {token}");
            }
            await _next(context);
        }
    }
}

Я не пытался заставить это работать с платформой OpenID, но я тестировал, используя собственную политику. Пока это регистрируется раньше, чем аутентификация, это промежуточное программное обеспечение должно выполняться до того, как инфраструктура будет искать токен в заголовке.

Я буду работать над POC с AAD в эти выходные, но я не хотел, чтобы вы ждали возможного решения.

~ Приветствия

0 голосов
/ 02 июля 2019

По умолчанию ваше веб-приложение не получит токен доступа из строки запроса.Обычно он получает токен доступа из заголовка авторизации или файла cookie.

Чтобы получить токен доступа из строки запроса, вам необходимо реализовать свой собственный способ аутентификации.

  1. Установите пакет NuGet для Microsoft.Owin.Security.ActiveDirectory.
  2. Создайте поставщик проверки подлинности, который будет получать токен доступа из строки запроса.

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider { public override Task RequestToken(OAuthRequestTokenContext context) { var value = context.Request.Query.Get("access_token"); if (!string.IsNullOrEmpty(value)) { context.Token = value; } return Task.FromResult<object>(null); } }

Добавить карту в.

app.Map("/yourpath", map => { map.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions { Provider = new QueryStringOAuthBearerProvider(), Tenant = tenantId, TokenValidationParameters = new TokenValidationParameters { ValidAudience = clientId } }); map.RunSignalR(hubConfiguration); });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...