在Silverlight中维护会话

时间:2009-08-20 18:16:21

标签: c# wcf silverlight silverlight-3.0

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

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

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

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

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

6 个答案:

答案 0 :(得分:3)

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

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

我无法看到为每个请求发送所有这些数据的重点。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

这就是......

  1. Silverlight APP向wcf登录服务发送身份验证
  2. WCF登录服务在db会话中验证并创建会话
  3. WCF登录将在成功登录时返回true,在unauthorizedlogin
  4. 中返回false
  5. Silverlight App store全局登录变量供以后使用
  6. 现在,您的应用和服务器上都有相关信息:)
  7. 下一个问题: 1.如何删除服务器中的会话? *只需创建注销按钮并调用该服务即可删除数据库中的会话 *并删除应用程序的全局变量(会话变量/登录变量)

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

        服务器站点上的
      • 只是做一些定期活动的会话检查。如果它不再有效,请将其删除。
    2. 基本上,您必须通过互联网发送会话ID才能调用您的所有服务以确认您是经过身份验证的用户:)

    3. 注意: 嗯,没有其他办法,因为服务是无国籍的。

答案 3 :(得分:0)

好的,首先,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应用程序,所以请记住妥善保护所有内容。

答案 4 :(得分:0)

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

您可以按照另一张海报的建议将用户的登录名和密码存储在隔离的存储空间中,但是确保首先加密该数据,它以明文形式存储在一个不起眼的位置并且不安全。

答案 5 :(得分:0)

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

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

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