2016-11-29 7 views
1

У меня есть приложение, и пользователь может видеть изображения, хранящиеся на хранении azure blob. Я хочу, чтобы URL-адреса изображений работали только в том случае, если пользователь вошел в систему. Копирование URL-адреса изображения и вставка в другой браузер не должны работать. Не знаете, как это можно сделать. Уже используется SAS с истечением срока его действия. Таким образом, связь будет работать полчаса. Я хочу сделать его доступным только для входа в систему, а не для ограничения времени.Создание Azure blob Url доступно только для зарегистрированных пользователей

ответ

0

доступа к документам в Blob Storage, они могут быть либо

  1. Общественного
  2. Accessed с ключом
  3. Accessed с SAS лексем

хранение не может знать о вашей системе аутентификации. Если вы не хотите привязывать токен по времени, вы можете настроить политику общего доступа в контейнере, установить время истечения срока действия и просто обратиться к политике в токенах SAS. Затем вы можете установить время истечения срока действия позже в политике без восстановления токена.

Но в противном случае вы можете использовать только токены SAS.

1

Предлагаю альтернативный подход - вы можете использовать функции поиска изображений как собственный контроллер (Image controller). Это позволит вам ограничить доступ к изображениям только для зарегистрированных пользователей. Удалите общедоступный доступ из своего контейнера, если вы это сделаете.

Другим преимуществом такого подхода является то, что если вы решили разместить свои изображения в другом месте (то есть не в блочном хранилище), вам нужно будет только изменить свой контроллер, а другие части вашего кода останутся без изменений. То есть, контроллер инкапсулирует вашу логику хостинга изображений.

+0

Как это работает? Значок требует фактического URL для отображения изображения. Как перевести это на что-то еще? – InTheWorldOfCodingApplications

+0

В ваших темах вы писали пароль asp.net, поэтому я предполагаю, что у вас есть конечная точка отдыха, с которой ваше приложение общается. В этом случае конечная точка доступа вашего контроллера теперь будет служить URL-адресом: www.yoursitename.com/Images/imageid. – PartlyCloudy

+0

Некоторые подробности - конечная точка получения изображения вернет HttpResponseMessage с байтами изображения в качестве содержимого и ontent.Headers.ContentType будет вашим типом изображения, например. MediaTypeHeaderValue ("image/jpeg") – PartlyCloudy

1

Обычно я использую 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" /> 

Как и другие предложили - не забудьте установить свой контейнер как «частный».

+0

Разве память не обширная, поскольку мы сначала загружаем blob? не настраивать напрямую InTheWorldOfCodingApplications

+0

При создании, например, html-изображений, которые вы используете:

+0

Получение экземпляра CloudBlockBlob не загружает содержимое блоба (даже получение метаданных, которые вы должны вызвать, например, метод FetchAttributes). В обработчике HTTP вы просто открываете поток ответов HTTP и «заполняете» его байтами непосредственно из содержимого blob. –