通过WCF生成文件,通过带有访问验证的ASP.NET下载
本文关键字:验证 访问 ASP 下载 NET WCF 文件 通过 | 更新日期: 2023-09-27 18:00:01
我需要实现一个操作,在该操作中,用户请求一个需要一些时间(2-4分钟)才能生成的文件。之后,用户需要下载文件,优先通过ASP.NET下载(以使用浏览器下载功能)。只有指定的用户才能下载此文件。
以下是我尝试的方法:
首先,我构建了一个双工wcf服务。用户用它需要的数据调用它,然后它开始生成文件,通过回调通道通知进度。最后,服务应该向用户发送一个url,用户将使用该url下载文件。这部分工作正常。
我将文件保存到asp_data文件夹中的临时文件夹中,以防止直接访问它。然后,我创建了一个aspx页面来接收令牌(无论它是什么),根据当前用户、定义的过期时间对其进行验证,并用文件替换响应。
然后事情变得一团糟。我不知道通过WCF生成令牌的正确方法,将其返回到客户端并使用它访问下载页面。我尝试了两种不同的方法,但我想我都放弃了:
-
为文件生成一个guid,在FormsAuthenticationTicket中对其进行加密(包含用户信息和过期时间),并将其发送到客户端。然后,客户端使用票证加密字符串作为下载页面的令牌,下载页面根据当前票证验证票证中的用户,检查过期时间,提取guid并将文件发回。问题是生成的加密字符串变得非常大,在url中无法使用。
-
为文件生成一个guid,将其保存在httpcontext会话中的ticket(带有验证数据和文件路径)中。wcf服务然后将guid传递给客户端,客户端使用它来访问下载页面。下载页面检查会话,检索票证,提供文件。问题是我在访问WCF操作中的会话时遇到了一些问题。用户请求文件,服务器启动一个线程来生成文件并进行回调调用,因此第一个服务器调用返回(无任何结果)。当我成功生成完文件后,回调线程会尝试访问会话,保存票证,并在"FinishOperationXXX"回调中将guid返回给用户。不过,我无法访问会话,因为它似乎不再可用于回调线程。
我不想使用数据库来做这件事,我试图避免通过WCF本身下载文件,但我需要让它发挥作用。我想我会设法做到的,但我想知道:
我这么做很难吗?有人知道如何实现类似的东西吗?
为什么需要加密和FormsAuthenticationTicket?
只使用文件类型、用户的userid和时间戳(filetype_userid_timestamp.ext)来命名文件,并且只允许用户下载中间字段中包含其userid的文件,这是否足够好?
(如果你有多个文件,每个页面的文件类型都不一样…)
用户的身份验证应该已经由会话处理了,对吗?