나는 응용 프로그램을 가지고 있으며 푸른 하늘에 저장되어있는 이미지를 볼 수 있습니다. 사용자가 로그인 한 경우에만 이미지 URL을 사용하고 싶습니다. 이미지 URL을 복사하고 다른 브라우저에 붙여 넣으면 작동하지 않아야합니다. 이것이 어떻게 행해지는지 모르겠습니다. SAS에 만료 시간이 이미 있습니다. 따라서 링크는 30 분 동안 작동합니다. 나는 그것을 시간 경계가 아닌 로그인 한 사용자 만 접근 가능하게하고 싶다.Azure blob URL은 로그인 한 사용자에게만 액세스 가능하게합니다.
답변
는 물방울 스토리지에 액세스 문서에, 그들은 토큰 SAS를 사용하여 액세스 키
- 공공
- 수 있습니다
저장하여 인증 시스템에 대해 알 수 없다. 토큰을 시간에 구속하지 않으려면 컨테이너에 공유 액세스 정책을 설정하고 거기에 만료 시간을 설정하고 SAS 토큰의 정책을 참조하면됩니다. 그런 다음 토큰을 재생성하지 않고 나중에 정책에서 만기 시간을 다시 설정할 수 있습니다.
그러나 그렇지 않은 경우 시간 바인딩 SAS 토큰 만 수행 할 수 있습니다.
독자적인 컨트롤러 (이미지 컨트롤러)로 이미지 검색 기능을 드러내는 방법을 제안합니다. 이렇게하면 로그인 한 사용자에게만 이미지에 대한 액세스를 제한 할 수 있습니다. 그렇게 할 경우 컨테이너에서 공용 액세스를 제거하십시오.
다른 방법으로 이미지를 호스팅하도록 선택한 경우 (예 : BLOB 저장소가 아닌 경우) 컨트롤러 만 변경하면 코드의 다른 부분은 변경되지 않습니다. 즉, 컨트롤러는 이미지 호스팅 논리를 캡슐화합니다.
나는 보통 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의 인스턴스를 가져 오면 blob의 내용 (예 : FetchAttributes 메서드를 호출해야하는 메타 데이터를 가져 오는 경우에도)이로드되지 않습니다. HTTP 처리기에서는 HTTP 응답 스트림을 열고 blob 내용에서 바이트를 직접 채 웁니다. –
어떻게 동작합니까?
태그에는 이미지를 표시 할 실제 URL이 필요합니다. 어떻게 다른 것을 번역 할 수 있습니까? –
InTheWorldOfCodingApplications
태그에서 asp.net을 작성 했으므로 응용 프로그램과 통신하는 나머지 끝점이 있다고 가정합니다. 이 경우 컨트롤러의 엔드 포인트는 www.yoursitename.com/Images/imageid의 URL로 사용됩니다. – PartlyCloudy
좀 더 자세히 - get 이미지 엔드 포인트는 그림 바이트를 내용으로 HttpResponseMessage를 리턴하고 ontent.Headers.ContentType은 사용자의 이미지 유형이됩니다. MediaTypeHeaderValue ("image/jpeg") – PartlyCloudy