保护从webjob调用的控制器操作

时间:2017-09-12 09:21:36

标签: c# asp.net-mvc azure-webjobs

我在Azure中部署了一个MVC网站,我需要允许用户从html页面生成pdf文件。我通过在从控制器操作调用的WebJob中调用wkhtmltopdf.exe来执行此操作。呈现的html页面由另一个返回ActionResult的控制器操作生成。

当我用[AllowAnonymous]装饰动作(用于呈现pdf的html)时,一切正常,但我想以某种方式保护它。

是否可以对来自Web作业的请求进行身份验证,或者mysecureaction仅将其数据返回给源自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

显然,这是web作业调用以获取html

的动作
[AllowAnonymous]
public ActionResult mysecureaction(int? id)
{
  SomeData model = new SomeData();
  // get some data from db using id
  return View(model);
}

1 个答案:

答案 0 :(得分:3)

这似乎不是一个很好用的WebJob。 WebJobs通常不会被Web应用程序调用,它们自己也不会向Web应用程序发送请求。相反,请考虑几个替代方案:

你可以直接在你的应用程序中完成工作,而不是使用WebJob,这在这里买不到你。

您可以通过队列而不是直接的http消息来完成应用程序和WebJob之间的通信。例如Web应用程序将工作项添加到队列中,WebJob将其选中,例如使用WebJobs SDK。