Как ограничить доступ к URL-адресам прокси приложения-функции Azure?

У меня есть прокси приложения-функции Azure, настроенный с проверкой подлинности Oauth2 (Google), который передает запросы в учетную запись хранилища больших двоичных объектов. Моя идея заключалась в том, чтобы использовать прокси в качестве слоя аутентификации / авторизации для статического HTML-сайта, хранящегося в хранилище больших двоичных объектов.

Итак, проверка подлинности работает, но теперь любой пользователь с учетной записью Google может видеть содержимое. Как я могу контролировать доступ, скажем, к настраиваемому набору учетных записей?

1 ответ

Ну, я не нашел быстрого способа сделать это с помощью прокси приложения-функции, и управление API, казалось, просто усложняло вещи (сервер авторизации? Сколько серверов мне нужно для статического сайта небольшой группы с некоторыми автоматически публикуемыми статистическими данными о том, что? мы делаем?), поэтому я выбрал приложение с функцией прокси, и вот оно:

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{

    var authURI = new Uri(req.RequestUri.GetLeftPart(UriPartial.Authority));
    var path = authURI.MakeRelativeUri(req.RequestUri);
    var prefix = "api/myfunction";
    var fileName = path.ToString().Remove(0,prefix.Length);

    // Get request body
    dynamic data = await req.Content.ReadAsAsync<object>();

    // Authorization - allow only @myorg.com users
    IEnumerable<string> headerValues = req.Headers.GetValues("X-MS-CLIENT-PRINCIPAL-NAME");
    var user = headerValues.FirstOrDefault();
    if (!user.EndsWith("@myorg.com", true, null))
    {
        return req.CreateResponse(HttpStatusCode.Forbidden, "Unauthorized");
    }

    var blobStorageURI = System.Configuration.ConfigurationManager              
         .ConnectionStrings["BLOB_SERVICE_ENDPOINT"].ConnectionString;
    var container = System.Configuration.ConfigurationManager
         .ConnectionStrings["BLOB_CONTAINER"].ConnectionString;
    var authKey = System.Configuration.ConfigurationManager
         .ConnectionStrings["BLOB_ACCESS_STRING"].ConnectionString;
    using(var client = new HttpClient())
    {
        client.BaseAddress = new Uri(blobStorageURI);
        var storagePath = "/" + container + fileName + authKey;
        return await client.GetAsync(storagePath);
    }
}

Вот функция.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "route": "myfunction/{*path}",
      "methods": [
        "get",
        "head"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ],
  "disabled": false
}
  • Обратите внимание на маршрутизацию и связь между маршрутизацией и жестко закодированной "myfunction".
  • Также можно избавиться от префикса "api" с помощью файла host.json.
  • Также обратите внимание на строки подключения, которые определяют доступ к хранилищу BLOB-объектов. Для этого я создал SAS (подпись общего доступа).
Другие вопросы по тегам