如何根据登录用户检索 asp.net 媒体/资源?

How to retrieve asp.net media / resources based on logged in user?

我有一个 asp.net 网络 api 项目使用基于令牌的身份验证。我的应用程序上传和检索图像,我将文件路径与上传的用户 ID 一起保存在 table_myfiles 中。

我希望用户只访问他上传的文件,我可以从 table.

中识别这些文件

如何保护我的资源以仅允许基于 table_myfile 的用户访问?而不是任何人没有登录或直接 link / 路径 ?

一周以来我一直在寻找任何可能的解决方案,我认为我应该实施一个中间件来管理访问。但是我找不到任何关于如何实现相同的资源。

目前我的 api 仅通过直接访问文件 path/link.

显示所有资源

简单的方法是从网站文件夹中删除虚拟文件夹或该文件夹。这样,任何文件都不存在简单的 URL。

那么,对于一个用户get/see/use/download一个文件?你现在说一个列表视图或某种显示和列出文件的网格(或转发器)。

那么,他们什么时候想下载或查看文件呢?

您使用 response.write 并将文件流式传输到客户端。

请记住,在服务器上,隐藏代码使用 100% 干净和正确的 windows 文件路径。对于任何基于 Web 的 URL,该文件夹必须位于网站的有效路径中。当他们输入有效的 URL 时,它最终会被转换为站点中的给定文件夹(或在 IIS 中创建映射的“虚拟”文件夹时提供的外部文件夹。但是,如果您不提供该文件夹虚拟文件夹,或者该文件夹不在网站 file/folder 设置中,则不存在有效的 URL。但是,可以直接使用该文件夹并使用代码隐藏 - 任何有效的服务器 path/folder 代码后面允许名称。

因为流式传输文件时,您需要路径名、文件名以及“我的”类型。值得庆幸的是,.net 4.5 或更高版本具有此功能。

所以,从数据库 (table) 我显示这样的文件名:

但是,如果你点击预览图片,那是一个图片按钮。

后面的代码只是 gets/grabs 来自数据库的文件名。

然后我将文件下载(流)到浏览器端,如下所示:

if (File.Exists(strInternalFullPath))
{
    string strConType = MimeMapping.GetMimeMapping(strInternalFullPath);

    binFile = File.ReadAllBytes(strInternalFullPath);
    Response.ContentType = strConType;
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(strWebUrl));
    Response.BinaryWrite(binFile);
    Response.End();
}
else
    MyToast2(this, btnLink.ClientID.ToString, "File Not found", "We no longer have this file avaiable.");

因此,此按钮的行为 100% 类似于 link,但不存在指向基于 Web URL 的文件夹的现有 URL 或路径名.

记住:

基于网络的 URLs - 他们自动从网站 URL 映射到现有文件夹。

您可以使用 server.MapPath("some url to file") 将其“翻译”为内部文件名。

基于代码的文件:

在您的 .net 代码中(代码隐藏)任何文件名都是标准平面,指向服务器上文件的简文件名。

因此,一旦我们从数据库中获得该文件名,您就可以像用户单击 link 一样传输该文件。但是您永远不必公开实际的文件名或文件路径。网站上不存在这样有效的 URL,因为您在网站文件夹层次结构中没有该文件夹 - 但将该文件夹放在网站之外。

只要该文件夹在 Web 文件夹之外,并且只要您不设置指向 Web 文件夹之外的该文件夹的虚拟文件夹即可?

那么隐藏代码仍然可以 get/grab/see/use 服务器上的任何文件。该代码使用完整有效的 windows 文件名,- 但网站将没有映射到此类文件夹 - 因此不存在或无法输入有效的 URL。