【问题标题】:Maintaining session in Silverlight在 Silverlight 中维护会话
【发布时间】:2009-08-20 18:16:20
【问题描述】:

我正在创建一个具有 WCF 连接性的 Silverlight。我想在用户登录 Silverlight 后创建并维护一个会话并执行以下操作。

  • 成功登录后,创建会话对象并存储会话 ID、用户 ID、用户名、会话状态
  • 在进一步调用 WCF 时,会话信息需要从 Silverlight 传递到 WCF

一种解决方案是创建一个会话对象并将其作为参数传递给所有方法。

有没有其他方法可以在不传递成员变量的情况下在所有 Web 服务调用中传递信息?

类似于 ASP.NET 中的持久会话对象。

【问题讨论】:

    标签: c# wcf silverlight silverlight-3.0


    【解决方案1】:

    为什么要每次都传递会话信息?

    如果您使用 ASP.NET 在 ASP 兼容模式下托管 WCF 服务,则可以将实例化模式设置为 Session,然后将所有内容存储在 WCF 服务实例变量中。或者在您的 ASP 会话对象中。

    我看不出你为每个请求发送所有这些数据的意义。

    将 SL 与 ASP.NET 一起使用时要做的一件好事是使用 ASP.NET 内置身份验证 Like here 登录,然后您可以调用 WCF 服务并检查 HttpContext.Current.User.Identity.IsAuthenticated 是否为真。

    【讨论】:

    • Silverlight 的问题是它只支持BasicHttpBinding,不允许你将实例化模式设置为Session。
    • 你确定吗?我确实在服务器端获得了会话 GUID。我实际上没有尝试过“为每个会话创建一个新实例”行为,因为我“手动”完成了所有对象锁定。
    【解决方案2】:

    如果在您的浏览器中启用了 Cookie,系统会自动为您处理会话。只需将一个空的 Global.asax 文件添加到您的 Web 应用程序,就会在第一次浏览器请求时自动创建一个会话。

    【讨论】:

      【解决方案3】:

      嗯..您可以使用 DB 来帮助您做到这一点..

      原来是这样的……

      1. Silverlight APP 向 wcf 登录服务发送身份验证
      2. WCF 登录服务验证并在您的数据库会话中创建会话
      3. WCF 登录将在成功登录时返回 true,在未授权登录时返回 false
      4. Silverlight 应用商店全局登录变量供以后使用
      5. 现在您的应用程序和服务器上都有信息了 :)

      下一个问题: 1. 如何删除服务器中的会话? * 只需创建注销按钮并调用服务以删除数据库中的会话 * 并删除您的应用程序的全局变量(会话变量/登录变量)

      1. 如果用户不点击退出按钮怎么办?

        • 在服务器站点上只做一些周期性的活动会话检查。如果它不再处于活动状态,请将其移除。
      2. 基本上,您必须通过 Internet 发送会话 ID 以调用您的所有服务,以确认您是经过身份验证的用户:)

      注意事项: 好吧,没有别的办法,因为服务是无状态的。

      【讨论】:

        【解决方案4】:

        首先,silverlight 不是 asp.net,WCF 在设计上是无状态的,除非另外构造以保持状态。

        然后,如果您想在 silverlight 3 中保持状态,您可以创建一个具有静态属性的静态类并跨页面维护这些值。但这不是一个优雅的解决方案。这是可能的,因为 SL 是客户端运行时,并且您的应用程序存在于当您导航到 url 时下载的 xap 程序集中,所以基本上它就像下载一个 Windows 桌面应用程序然后在受限制的安全上下文中运行。我现在不想深入探讨它的含义,但重要的是你知道它存在。

        解决问题的更好方法是像这样使用IsolatedStorage

                IsolatedStorageSettings.ApplicationSettings.Remove("UserName");
                IsolatedStorageSettings.ApplicationSettings.Add("UserName", UserName);
                IsolatedStorageSettings.ApplicationSettings.Remove("Password");
                IsolatedStorageSettings.ApplicationSettings.Add("Password", UserPassword);
        

        通过这样做,您实际上可以将数据保存到应用程序设置中,并在下次启动应用程序时重新使用它。请记住,存储在 IsolatedStorage 中的所有内容基本上都是明文,只能从同一域/站点访问。

        您必须使用许多可用的安全方案之一来保护您的 WCF 服务,否则 SL3 传输到 WCF 服务的信息将以明文形式显示,任何人只要付出一点努力就可以读取,并且任何人都可以绕过您的 wcf 服务完全保护您的 SL 应用程序,因此请记住妥善保护所有内容。

        【讨论】:

        • 隔离存储未加密,因此请在保存数据之前确保数据安全。
        • Silverlight 不提供 RSA 加密支持来保护用户密码,然后再将其保存到 IsolatedStorage。无论如何,我强烈反对将此类信息(密码或登录名)放入隔离存储中,因为它很容易被盗。即使您存储某种哈希值,请考虑该值被盗并应用于其他一些隔离存储
        【解决方案5】:

        silverlight 中的 WCF 身份验证是通过您无权访问的 SOAP 标头执行的 - 您无法根据请求将身份验证信息从 Silverlight 传递到 WCF。假设您使用 ASP.NET 应用程序服务来执行用户身份验证(这是我所知道的唯一可以在这里工作的技术),您的基本策略可能是调用 ValidateUser 方法,该方法将执行登录并指示 Silverlight 控件在 SOAP 标头中包含该用户会话信息,然后调用 WCF 服务。您可以通过在后台登录用户来定期刷新会话,也可以根据凭据等待 WCF 调用失败,然后再次验证用户。我不知道调用 WCF 服务是否有一些保持活动的方面,这可能会使重新验证的需求变得不那么紧迫。

        您可以按照另一位发帖人的建议将用户的登录名和密码存储在隔离存储中,但请确保首先加密该数据,它以纯文本形式存储在不明显的位置并且不安全。

        【讨论】:

          【解决方案6】:

          最终目标只是暂时存储用户的变量,只要他们的浏览器是打开的。不管优雅,如果不是兆字节的数据,我只是将它们临时存储在应用程序或类的内存中的变量或资源中,这样您就不必担心它会在他们的机器上本地显示。浏览器会话结束后它就会消失。

          App.Current.Resource.Add("MySessionItem", item)
          

          对于 WCF 调用,请尝试让 ASP.net 使用 ASP.net 应用程序服务(即 My.User.Identity)为您进行身份验证,不要根据您存储的那些传递参数在您的 WCF 方法中进行身份验证临时变量和/或资源。

          【讨论】:

          • 这假设您想使用 ASP.Net。这是一个愚蠢的假设。虽然主要客户端可能是 Silverlight,但也可能有其他类型的客户端不是浏览器。尤其适用于自动化或数据导入/导出。
          猜你喜欢
          • 1970-01-01
          • 2011-11-08
          • 2013-11-18
          • 2011-03-03
          • 2013-09-11
          • 1970-01-01
          • 1970-01-01
          • 2018-06-09
          • 1970-01-01
          相关资源
          最近更新 更多