2009-08-20 123 views
2

我使用WCF连接创建Silverlight。我想在Silverlight中用户登录后创建并维护一个会话,并执行以下操作。在Silverlight中维护会话

  • 成功登录,创建一个会话对象和存储会话ID,用户ID,用户名,会话状态
  • 在与WCF还呼吁,会话信息需要从Silverlight的传递给WCF

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

是否有任何其他方式在没有传递成员变量的情况下在所有Web服务调用中传递信息?

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

回答

3

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

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

我不明白你的意思是在发送每个请求的所有数据。

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

+1

Silverlight的事情是它只支持BasicHttpBinding,它不允许你将实例化模式设置为Session。 – Phil 2010-09-22 14:15:02

+0

你确定吗?我确实在服务器端获得会话GUID。我实际上并没有尝试过“为每个会话创建一个新的实例”行为,因为我手动完成了所有的对象锁定。 – R4cOON 2010-09-24 12:51:46

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); 

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

您必须使用其中一种可用的安全方案来保护您的WCF服务,否则,SL3传输到WCF服务的信息将以明文形式提供,任何人都可以轻松读取,并且任何人都可以调用您的wcf服务完全绕过你的SL应用程序,所以记得妥善保护一切。

+5

独立存储未加密,因此请在保存数据之前保护它。 – 2009-08-21 15:03:23

+0

在将Silverlight保存到IsolatedStorage之前,Silverlight不提供RSA加密支持来保护用户密码。无论如何,我强烈建议不要将这种类型的信息(密码或登录信息)放入隔离存储器中,因为它可能很容易丢失。即使您存储某种散列,请考虑将该值盗取并应用于某些其他独立存储 – 2010-12-09 19:48:57

0

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

您可以存储用户的登录名和密码在独立存储的另一个海报的建议,但要确保你加密数据首先,它是纯文本格式存储在一个不起眼的位置,也不安全。

0

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

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

对于WCF调用,尽量让ASP.net做了authenication为您ASP.net应用服务(即My.User.Identity),不基于这些通过您的WCF方法验证将参数存储在临时变量和/或资源中。

+0

这假定您想要使用ASP.Net。这是一个愚蠢的假设。虽然主要客户端可能是Silverlight,但也可能有其他类型的客户端不是浏览器。尤其适用于自动化或数据导入/导出。 – Christopher 2010-01-21 14:53:35

1

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

1

嗯..你可以使用数据库来帮助你做到这一点..

这是事情...

  1. Silverlight应用程序发送身份验证WCF登录服务
  2. WCF登录服务在你的数据库会话中验证和创建会话
  3. WCF登录将在成功登录时返回true,在非法登录时返回false
  4. Silverlight应用商店全局登录变量供后期使用
  5. 现在你在你的应用和服务器:)上的信息

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

  1. 如何,如果用户不点击注销按钮?

    • 在服务器站点只是做一些周期性的活动会话检查。如果它不再有效,请将其删除。
  2. 基本上,你必须把你的会话ID通过互联网打电话给您的所有服务,以确认您的身份验证的用户:)

注: 那么,有没有其他办法,因为服务是无状态的。