我在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);
}
答案 0 :(得分:3)
这似乎不是一个很好用的WebJob。 WebJobs通常不会被Web应用程序调用,它们自己也不会向Web应用程序发送请求。相反,请考虑几个替代方案:
你可以直接在你的应用程序中完成工作,而不是使用WebJob,这在这里买不到你。
您可以通过队列而不是直接的http消息来完成应用程序和WebJob之间的通信。例如Web应用程序将工作项添加到队列中,WebJob将其选中,例如使用WebJobs SDK。