2016-11-29 2 views
1

나는 응용 프로그램을 가지고 있으며 푸른 하늘에 저장되어있는 이미지를 볼 수 있습니다. 사용자가 로그인 한 경우에만 이미지 URL을 사용하고 싶습니다. 이미지 URL을 복사하고 다른 브라우저에 붙여 넣으면 작동하지 않아야합니다. 이것이 어떻게 행해지는지 모르겠습니다. SAS에 만료 시간이 이미 있습니다. 따라서 링크는 30 분 동안 작동합니다. 나는 그것을 시간 경계가 아닌 로그인 한 사용자 만 접근 가능하게하고 싶다.Azure blob URL은 로그인 한 사용자에게만 액세스 가능하게합니다.

답변

0

는 물방울 스토리지에 액세스 문서에, 그들은 토큰 SAS를 사용하여 액세스 키

  • 하여 액세스 중 하나

    1. 공공
    2. 수 있습니다

    저장하여 인증 시스템에 대해 알 수 없다. 토큰을 시간에 구속하지 않으려면 컨테이너에 공유 액세스 정책을 설정하고 거기에 만료 시간을 설정하고 SAS 토큰의 정책을 참조하면됩니다. 그런 다음 토큰을 재생성하지 않고 나중에 정책에서 만기 시간을 다시 설정할 수 있습니다.

    그러나 그렇지 않은 경우 시간 바인딩 SAS 토큰 만 수행 할 수 있습니다.

  • 1

    독자적인 컨트롤러 (이미지 컨트롤러)로 이미지 검색 기능을 드러내는 방법을 제안합니다. 이렇게하면 로그인 한 사용자에게만 이미지에 대한 액세스를 제한 할 수 있습니다. 그렇게 할 경우 컨테이너에서 공용 액세스를 제거하십시오.

    다른 방법으로 이미지를 호스팅하도록 선택한 경우 (예 : BLOB 저장소가 아닌 경우) 컨트롤러 만 변경하면 코드의 다른 부분은 변경되지 않습니다. 즉, 컨트롤러는 이미지 호스팅 논리를 캡슐화합니다.

    +0

    어떻게 동작합니까? 태그에는 이미지를 표시 할 실제 URL이 필요합니다. 어떻게 다른 것을 번역 할 수 있습니까? – InTheWorldOfCodingApplications

    +0

    태그에서 asp.net을 작성 했으므로 응용 프로그램과 통신하는 나머지 끝점이 있다고 가정합니다. 이 경우 컨트롤러의 엔드 포인트는 www.yoursitename.com/Images/imageid의 URL로 사용됩니다. – PartlyCloudy

    +0

    좀 더 자세히 - get 이미지 엔드 포인트는 그림 바이트를 내용으로 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의 인스턴스를 가져 오면 blob의 내용 (예 : FetchAttributes 메서드를 호출해야하는 메타 데이터를 가져 오는 경우에도)이로드되지 않습니다. HTTP 처리기에서는 HTTP 응답 스트림을 열고 blob 내용에서 바이트를 직접 채 웁니다. –