У меня есть приложение, и пользователь может видеть изображения, хранящиеся на хранении azure blob. Я хочу, чтобы URL-адреса изображений работали только в том случае, если пользователь вошел в систему. Копирование URL-адреса изображения и вставка в другой браузер не должны работать. Не знаете, как это можно сделать. Уже используется SAS с истечением срока его действия. Таким образом, связь будет работать полчаса. Я хочу сделать его доступным только для входа в систему, а не для ограничения времени.Создание Azure blob Url доступно только для зарегистрированных пользователей
ответ
доступа к документам в Blob Storage, они могут быть либо
- Общественного
- Accessed с ключом
- Accessed с SAS лексем
хранение не может знать о вашей системе аутентификации. Если вы не хотите привязывать токен по времени, вы можете настроить политику общего доступа в контейнере, установить время истечения срока действия и просто обратиться к политике в токенах SAS. Затем вы можете установить время истечения срока действия позже в политике без восстановления токена.
Но в противном случае вы можете использовать только токены SAS.
Предлагаю альтернативный подход - вы можете использовать функции поиска изображений как собственный контроллер (Image controller). Это позволит вам ограничить доступ к изображениям только для зарегистрированных пользователей. Удалите общедоступный доступ из своего контейнера, если вы это сделаете.
Другим преимуществом такого подхода является то, что если вы решили разместить свои изображения в другом месте (то есть не в блочном хранилище), вам нужно будет только изменить свой контроллер, а другие части вашего кода останутся без изменений. То есть, контроллер инкапсулирует вашу логику хостинга изображений.
Обычно я использую HttpHandler.
Образец сниппет:
public class BlobHandler : IHttpHandler, IReadOnlySessionState
{
public void ProcessRequest(HttpContext context)
{
var request = context.Request;
var response = context.Response;
var path = request.Url.AbsolutePath;
var parts = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
// fetch record from db
var attachment = Attachment.FetchByUrl(parts[parts.length - 1]);
if (attachment == null)
throw new HttpException(404, "Blob not found.");
// helper method - get a blob instance, if it doesn't exist return null
var blob = CloudStorage.GetBlob(Constants.StoragePrivateContainer, attachment.BlobPath);
if (blob == null)
throw new HttpException(404, "Blob not found.");
// custom auth
if (!context.Request.IsAuthenticated)
throw new HttpException(403, "Access denied.");
var p = context.User as CustomPrincipal;
if (p == null)
throw new HttpException(403, "Access denied.");
if (!p.IsInRole(Enums.Role.Downloader))
throw new HttpException(403, "Access denied.");
blob.DownloadToStream(context.Response.OutputStream);
response.ContentType = blob.Properties.ContentType;
response.Flush();
}
public bool IsReusable => true;
}
Игнорировать "клякса" путь в RouteConfig:
routes.IgnoreRoute("blob/{*pathInfo}");
Добавить обработчик в обработчики раздела в web.config:
<add name="Blobs" path="blob/*" verb="*" type="MyLibrary.BlobHandler" resourceType="Unspecified" preCondition="integratedMode" />
Как и другие предложили - не забудьте установить свой контейнер как «частный».
Разве память не обширная, поскольку мы сначала загружаем blob? не настраивать напрямую –
InTheWorldOfCodingApplications
При создании, например, html-изображений, которые вы используете: –
Получение экземпляра CloudBlockBlob не загружает содержимое блоба (даже получение метаданных, которые вы должны вызвать, например, метод FetchAttributes). В обработчике HTTP вы просто открываете поток ответов HTTP и «заполняете» его байтами непосредственно из содержимого blob. –
Как это работает? Значок
требует фактического URL для отображения изображения. Как перевести это на что-то еще? –
InTheWorldOfCodingApplications
В ваших темах вы писали пароль asp.net, поэтому я предполагаю, что у вас есть конечная точка отдыха, с которой ваше приложение общается. В этом случае конечная точка доступа вашего контроллера теперь будет служить URL-адресом: www.yoursitename.com/Images/imageid. – PartlyCloudy
Некоторые подробности - конечная точка получения изображения вернет HttpResponseMessage с байтами изображения в качестве содержимого и ontent.Headers.ContentType будет вашим типом изображения, например. MediaTypeHeaderValue ("image/jpeg") – PartlyCloudy