如何向 ASP.NET MVC 网络应用发出授权的 HttpWebRequest
How to make an Authorized HttpWebRequest to an ASP.NET MVC web app
我有一个 ASP.NET MVC 网络应用程序需要允许 public API 下载文件。
这是操作代码:
public ActionResult DownloadFile(int id)
{
var item = _context.GetRepositoryFileByID(id);
if (item == null)
{
return HttpNotFound();
}
var filePath = Path.Combine(AppConfig.FilesRepositoryStorageRoot, item.IntrenalFilePath);
return File(filePath, "application/pdf");
}
此方法是设置了 [Authorize(Roles = "Administrator,User")]
属性的控制器,因此只有登录用户才能访问此操作
现在此操作应允许用户使用以下代码发出请求:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(fileDownloadUrl));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
我在这里缺少的是如何将授权的 HttpWebRequest
传递给 DownloadFile
操作。
我尝试过的每件事都会 return 登录页面,因为应用程序无法授权用户并允许他访问 DownloadFile
操作。
我尝试使用以下代码将此 Cookie 值传递给请求文件的网站
var authCookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, true);
var authCoockieValue = authCookie.Value;
然后网站就这样使用了这个值:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(fileDownloadUrl));
request.Headers[HttpRequestHeader.Authorization] = "Bearer " + authorization;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
但这没有用..我也尝试用"Basic"而不是"Bearer"标签传递header,但它也是字段。
我接受了这一点,我真的不明白 ASP.NET MVC 应用程序如何将 [Authorize]
属性与 FormsAuthentication
一起使用,所以我谦虚地请求您的帮助...
取决于您使用的身份验证类型。一般情况下,只要模拟用户登录时浏览器在做什么即可(根据您的代码+web.config,或者您可以使用网络调试工具捕获网络请求)。在登录表单和 cookie 的情况下,只需从 HttpWebRequest 调用登录操作,并使用 CookieContainer 以便将生成的 cookie 持久保存到下一个请求。或者您可以创建一个新的身份验证 API,甚至可以创建一个具有不同身份验证的全新 Web 应用程序。
我找到了解决办法。
您需要像这样向 HttpWebRequest
添加身份验证 Cookie:
Uri fileDownloadURI = new Uri(fileDownloadUrl);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileDownloadURI);
request.Headers[HttpRequestHeader.Authorization] = "Bearer " + authorization;
var authCookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, true);
Cookie requestAuthCoockie = new Cookie()
{
Expires = authCookie.Expires,
Name = authCookie.Name,
Path = authCookie.Path,
Secure = authCookie.Secure,
Value = authCookie.Value,
Domain = fileDownloadURI.Host,
HttpOnly = authCookie.HttpOnly,
};
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(requestAuthCoockie);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
我有一个 ASP.NET MVC 网络应用程序需要允许 public API 下载文件。 这是操作代码:
public ActionResult DownloadFile(int id)
{
var item = _context.GetRepositoryFileByID(id);
if (item == null)
{
return HttpNotFound();
}
var filePath = Path.Combine(AppConfig.FilesRepositoryStorageRoot, item.IntrenalFilePath);
return File(filePath, "application/pdf");
}
此方法是设置了 [Authorize(Roles = "Administrator,User")]
属性的控制器,因此只有登录用户才能访问此操作
现在此操作应允许用户使用以下代码发出请求:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(fileDownloadUrl));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
我在这里缺少的是如何将授权的 HttpWebRequest
传递给 DownloadFile
操作。
我尝试过的每件事都会 return 登录页面,因为应用程序无法授权用户并允许他访问 DownloadFile
操作。
我尝试使用以下代码将此 Cookie 值传递给请求文件的网站
var authCookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, true);
var authCoockieValue = authCookie.Value;
然后网站就这样使用了这个值:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(fileDownloadUrl));
request.Headers[HttpRequestHeader.Authorization] = "Bearer " + authorization;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
但这没有用..我也尝试用"Basic"而不是"Bearer"标签传递header,但它也是字段。
我接受了这一点,我真的不明白 ASP.NET MVC 应用程序如何将 [Authorize]
属性与 FormsAuthentication
一起使用,所以我谦虚地请求您的帮助...
取决于您使用的身份验证类型。一般情况下,只要模拟用户登录时浏览器在做什么即可(根据您的代码+web.config,或者您可以使用网络调试工具捕获网络请求)。在登录表单和 cookie 的情况下,只需从 HttpWebRequest 调用登录操作,并使用 CookieContainer 以便将生成的 cookie 持久保存到下一个请求。或者您可以创建一个新的身份验证 API,甚至可以创建一个具有不同身份验证的全新 Web 应用程序。
我找到了解决办法。
您需要像这样向 HttpWebRequest
添加身份验证 Cookie:
Uri fileDownloadURI = new Uri(fileDownloadUrl);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileDownloadURI);
request.Headers[HttpRequestHeader.Authorization] = "Bearer " + authorization;
var authCookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, true);
Cookie requestAuthCoockie = new Cookie()
{
Expires = authCookie.Expires,
Name = authCookie.Name,
Path = authCookie.Path,
Secure = authCookie.Secure,
Value = authCookie.Value,
Domain = fileDownloadURI.Host,
HttpOnly = authCookie.HttpOnly,
};
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(requestAuthCoockie);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();