2017-09-12 12 views
0

私はMVC WebサイトをAzureにデプロイしています。そこでは、ユーザーがhtmlページからpdfファイルを生成できるようにする必要があります。私はコントローラアクションから呼び出されたWebJob内でwkhtmltopdf.exeを呼び出すことでこれを行います。レンダリングされるHTMLページは、ActionResultを返す別のコントローラアクションによって生成されます。webjobから呼び出されるコントローラアクションを保護する

[AllowAnonymous]を使ってアクション(私はpdfのhtmlをレンダリングする)を装飾するとすべてうまく動作しますが、何とかそれを保護したいと思います。

Webジョブからの要求を認証することも、mysecureactionにWebジョブからの要求にのみデータを返すこともできますか?ここで

は、私のWebの仕事のコードです:

static void Main(string[] args) 
{ 
    if (args.Length == 2) 
    { 
    var URL = args[0]; 
    var filename = args[1]; 

    try 
    { 
     using (var p = new System.Diagnostics.Process()) 
     { 
     var startInfo = new System.Diagnostics.ProcessStartInfo 
     { 
      FileName = "wkhtmltopdf.exe", 
      Arguments = URL + " " + filename, 
      UseShellExecute = false, 
     }; 
     p.StartInfo = startInfo; 
     p.Start(); 
     p.WaitForExit(); 
     p.Close(); 
     } 

     // here save the pdf file to azure blob storage 
    } 
    catch (Exception ex) { /*error handling*/ } 
    } 
    } 

そしてここでは、Webの仕事を呼び出すコードです:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +   
Request.ApplicationPath.TrimEnd('/'); 
string Url = baseUrl + "/mycontroller/mysecureaction/" + id.ToString(); 
string filename = "filename.pdf"; 

try 
{ 
    using (var client = new HttpClient()) 
    { 
    client.BaseAddress = new Uri("https://myazurewebapp.scm.azurewebsites.net/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    var userName = "$myazurewebappuser"; 
    var password = "myazurewebapppassword"; 
    var encoding = new ASCIIEncoding(); 
    var authHeader = new AuthenticationHeaderValue("Basic", 
     Convert.ToBase64String(
    encoding.GetBytes(string.Format($"{userName}:{password}")))); 
    client.DefaultRequestHeaders.Authorization = authHeader; 
    var content = new System.Net.Http.StringContent(""); 

    HttpResponseMessage response = 
    await client.PostAsync($"api/triggeredwebjobs/myWebJob/run?arguments={Url} {filename}", content); 

    if (!response.IsSuccessStatusCode) 
    { 
     //error handling 
    } 
    } 
} 
catch (Exception ex) 
{ 
    //error handling 
} 


byte[] file = null; 
try 
{ 
    using (var client = new WebClient()) 
    { 
    // retrieve the file from blob storage 
    file = client.DownloadData("https://myazureaccount.blob.core.windows.net/pdf/" + filename); 
    } 
} 
catch (Exception ex) { /*error handling*/ } 

// return the file to the user 

そして、明らかにここにウェブの仕事は、HTML

を取得するために呼び出すアクションだが
[AllowAnonymous] 
public ActionResult mysecureaction(int? id) 
{ 
    SomeData model = new SomeData(); 
    // get some data from db using id 
    return View(model); 
} 

答えて

3

これはWebJobをうまく使用しているようには見えません。 WebJobは、通常、Webアプリケーションによって呼び出されるのではなく、Webアプリケーションに要求を送信するものでもありません。代わりに、いくつかの代替案を考えてみましょう:

ここで多くのことを購入していないWebJobを使うのではなく、アプリ内から直接作業を行うことができます。

アプリとWebJob間の通信は、直接httpメッセージではなくキュー経由で行うことができます。例えばWebアプリケーションはキューに作業項目を追加し、WebJobはそれらを取り上げます。 WebJobs SDKを使用します。

+0

ありがとう、これは素晴らしいコメントです。私がWebJobを使用する理由は、Azureで直接使用することのできないpdf変換実行ファイルでした。私はどのようにキューを実装するかを調べ始めるでしょう、誰かが私を特定の方向に向けることができれば感謝します。 – crazysnake

+0

@crazysnake WebアプリケーションとWebJobは同じサンドボックス内で実行されるため、WebJobで何かが可能な場合、Webアプリケーションでも機能します。サポートされているPDFツールとサポートされていないPDFツールのリストについては、[here](https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#unsupported-frameworks)を参照してください。 –

+0

甘い! Davidに感謝します!私がAzureサンドボックス内で外部実行ファイルを実行することは不可能であったが、私自身のラッパークラスライブラリを作成することは、そのトリックを完璧にやったという印象を受ける前に発見した資料によると、また、問題なくAllowAnonymous属性を使用できます。 – crazysnake

関連する問題