【问题标题】:Generate file through WCF, download through ASP.NET with access validation通过 WCF 生成文件,通过 ASP.NET 下载并进行访问验证
【发布时间】:2011-06-20 17:04:28
【问题描述】:

我需要实现一个操作,在该操作中用户请求一个需要一段时间才能生成的文件(2 - 4 分钟)。之后,用户需要下载文件,优先通过 ASP.NET(使用浏览器下载工具)。只有指定的用户才能下载此文件。

这是我尝试的方法:

首先,我构建了一个双工 wcf 服务。用户用它需要的数据调用它,然后它开始生成文件,通过回调通道通知进度。最后,该服务应该向用户发送一个 url,即他将用来下载文件的令牌。这部分工作正常。

我将文件保存到 asp_data 文件夹中的临时文件夹中,以防止直接访问它。然后我创建了一个 aspx 页面来接收令牌(无论它是什么),根据当前用户、定义的过期时间验证它,并用文件替换响应。

然后事情变得一团糟。我不知道通过 WCF 生成令牌的正确方法,将其返回给客户端并使用它访问下载页面。我尝试了两种不同的方法,但我想我都放弃了:

  • 为文件生成一个 guid,在 FormsAuthenticationTicket 中对其进行加密(使用用户信息和到期时间)并将其发送到客户端。然后,客户端使用票证加密字符串作为下载页面的令牌,它会根据当前票证验证票证中的用户,检查到期时间,提取 guid 并将文件发回。问题是生成的加密字符串变得非常大,无法在 url 中使用。

  • 为文件生成一个 guid,将其保存在 httpcontext 会话中的票证(带有验证数据和文件路径)中。然后 wcf 服务将 guid 传递给客户端,客户端使用它来访问下载页面。下载页面检查会话、检索票证、提供文件。问题是我在访问 WCF 操作中的会话时遇到了一些麻烦。用户请求文件,服务器启动一个线程来生成文件并进行回调调用,因此第一个服务器调用返回(无)。当我成功生成文件后,回调线程会尝试访问会话、保存票证并在“FinishOperationXXX”回调中将 guid 返回给用户。但是,我无法访问会话,因为它似乎不再可用于回调线程。

我不想使用数据库来执行此操作,并且我试图避免通过 WCF 本身下载文件,但我需要让它工作。我想我会设法做到这一点,但我想知道:

我这样做很难吗? 有没有人知道如何实现类似的东西?

【问题讨论】:

    标签: c# asp.net wcf download


    【解决方案1】:

    为什么需要加密和 FormsAuthenticationTicket?

    仅使用文件类型、用户的用户 ID 和时间戳 (filetype_userid_timestamp.ext) 命名文件并只允许用户下载在中间字段中包含其用户 ID 的文件不是很好吗?

    (如果您有多个页面,则每个页面的文件类型都不同......)

    用户的身份验证应该已经由会话处理了吧?

    【讨论】:

    • 嗯,它确实有效。我仍然想知道是否有针对整个问题的更有条理的解决方案,但现在这已经足够了。
    • 很抱歉,我只是不明白您在使用 FormsAuthenticationTicket 做什么。也许关于它的那一部分的单独问题会更清楚地说明这个主题? (您是否需要 2 种身份验证用户 客户端/服务器会话,而用户的其他登录将没有文件访问权限?)
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多