0

まずはアドバイスが必要です。ASP.NET Core 2.0 - Azure Storageからファイルを転送する方法

私のアプリはPDFを生成し、それをAzureストレージにプライベートコンテナに保存します。しかし、ユーザーが認証(私はAzure AD B2Cを使用)し、彼の個人ページに行くとき、私はそれらのPDFへのリンクを表示する必要があります。さて、これらのリンクは、公開してはならないので、私は、私は必要だと思う:

1)彼はリンク

2のそれらの種類にアクセスしたときに、ユーザーをのauthするためのミドルウェアのいくつかの種類)ストレージとパスからファイルを要求しますそれは応答にあります

これを行う最善の方法は何ですか? (パフォーマンスも考慮)

私の最初のアイデアは、SASトークンを使用し、約5-10分だけ時間を制限することでした。しかし、ユーザーがページを開いてブラウザを1時間開いたままにしてから、戻ってPDFリンクをクリックするとどうなりますか?

+1

パフォーマンス上の理由から、SASトークンを使用することをお勧めします。ページロード時にblob URLを生成する代わりに、APIへのリンクを作成し、トークンを生成し、リダイレクト応答をフルパス(uri + token)に返すだけで、空のストレージに戻すことができます。このようにして、ユーザがブロブへの古いリンクを得る可能性はない。 –

+0

私がここに持つ唯一の問題は、ユーザーが実際のPDFへのリンクを取得して電子メールで送信することです。トークンが期限切れになると、リンクは切断されます。そうでなければ、それは基本的に公開されているので、別の方法があるかもしれないと思った。 – alvipeo

+0

あなたの意図する動作が何であるかははっきりしないが、あなたが導入しているものは、どのような方法を使用しても問題ではない。ユーザーが**プライベート**ファイルへのリンクをメールで送信するのはなぜですか? –

答えて

1

私は@Federico Dipumaに同意します。私は私のプロジェクトの一つでこの方法を使用しました。私は自分のコードを共有するためにここにいます。

生成コードSAS URL。

public string GetBlobSasUri(string containerName, string blobName, string connectionstring) 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionstring); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference(containerName); 
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); 

    //Set the expiry time and permissions for the blob. 
    //In this case no start time is specified, so the shared access signature becomes valid immediately. 
    SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy(); 
    sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10); 
    sasConstraints.Permissions = SharedAccessBlobPermissions.Read; 

    //Generate the shared access signature on the blob, setting the constraints directly on the signature. 
    string sasContainerToken = blockBlob.GetSharedAccessSignature(sasConstraints); 

    //Return the URI string for the blob, including the SAS token. 
    return blockBlob.Uri + sasContainerToken; 
} 

ウェブアプリケーションのURLにリダイレクトします。

public ActionResult FileDownload() 
{ 
    string blobURL = GetBlobSasUri("blob name","container name", "connection string"); 
    return Redirect(blobURL); 
} 
関連する問題