如何向 ASP.NET MVC Web 应用程序发出授权的 HttpWebRequest

本文关键字:授权 HttpWebRequest 应用程序 Web ASP NET MVC | 更新日期: 2023-09-27 18:35:55

我有一个 ASP.NET 的MVC Web应用程序,需要允许公共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操作。

我尝试过的每件事都会返回登录页面,因为应用程序无法授权用户并允许他访问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();

但这没有用。.我还尝试使用"基本"而不是"持有者"标签传递标题,但它也字段。

我真的不明白 ASP.NET MVC 应用程序如何使用 [Authorize] 属性FormsAuthentication所以我谦虚地寻求您的帮助......

如何向 ASP.NET MVC Web 应用程序发出授权的 HttpWebRequest

我已经找到了解决方案。您需要像这样将身份验证 Cookie 添加到HttpWebRequest

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();

取决于您使用的身份验证类型。通常,只需模拟用户登录时浏览器正在执行的操作(您应该根据 code+web.config 知道,或者您可以使用 Web 调试工具来捕获 Web 请求)。如果是登录表单和 Cookie,只需从您的 HttpWebRequest 调用登录操作,并使用 CookieContainer,以便生成的 cookie 将保存到下一个请求中。或者,您可以创建一个新的身份验证 API,甚至是具有不同身份验证的全新 Web 应用程序。