WPF和客户端应用程序服务的注销问题

时间:2010-10-22 13:58:52

标签: wpf forms-authentication client service

我最近使用WPF和客户端应用程序服务对应用程序进行了原型设计。我正在尝试使用客户端应用程序服务的所有三个功能:表单身份验证,角色安全性和客户端配置文件。我已经成功地完成了所有工作,但我觉得我的解决方案是一个很好的方法,并希望有更好的方法。

讨论假设如下:

我有两个WPF窗口:

第一个窗口是我的主要申请表。它有两个按钮“Login”和“Check Thread Principal”

第二个窗口是一个登录表单,它实现IClientFormsAuthenticationCredentialsProvider接口,以使用GetCredentials方法返回带有输入的用户名和密码的新ClientFormsAuthenticationCredentials对象。

应用程序启动,加载主窗口,用户单击登录按钮。在按钮单击事件中,将调用System.Web.Security.Membership.ValidateUser(String.Empty,String.Empty)。这会导致我的登录表单中的GetCredentials方法被调用,该方法依次显示登录窗口。主窗口的按钮单击事件中的代码将一直等到用户在登录窗口中输入信息。

用户提交登录信息后,登录表单关闭,执行流程返回主窗口登录点击事件。如果提交的用户名和密码有效,则Thread.CurrentPrincipal具有相应的FormAuthentication Principal。

如果我们返回主窗口并单击“Check Thread Principal”按钮,并检查按钮单击事件上的Thread.CurrentPrincipal,我们看到Thread.CurrentPrincipal不再是FormsAuthentication Principal,而是通用Windows主体。

在我的研究中,我找到了几种方法来解决这个问题:

第一种是在验证用户之后立即调用AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal)。这将确保FormsAuthentication Principal在应用程序的生命周期内保持不变。这个问题是我无法设置它两次。因此,如果我调用ClientFormsAuthenticationMembershipProvider.LogOut()方法,并尝试再次执行登录过程。我得到一个“默认主体对象不能设置两次”的execption。

第二种方法,我为原型选择的方法是创建一个名为UserAuthentication的类。在这个类中有一个名为Current的静态属性,它返回UserAuthentication类型的单例。在UserAuthentication类中,我维护自己的CurrentPrinipal和Original Principal属性,这些属性的类型为IPrincipal。我还有LogIn和LogOut方法来管理对System.Web.Security.Membership.ValidateUser(String.Empty,String.Empty)和ClientFormsAuthenticationMembershipProvider.LogOut()的调用,并维护我封装的CurrentPrinipal和Original Principal属性的状态。 / p>

通过将其作为单例执行,我仍然可以通过调用CommonAssembly.UserAuthentication.Current.CurrentPrincipal.IsInRole(“SomeRole”)来访问IsInRole功能。我可以通过确保在调用Properties.Settings.Default.Save()之前实现客户端配置文件功能,我调用System.Threading.Thread.CurrentPrincipal = CommonAssembly.UserAuthentication.Current.CurrentPrincipal。

这很有效,但我觉得这是一个kludge,在我的研究中,我找不到合适的解决方案。我知道问题的一部分是WPF如何处理执行上下文,但我觉得必须有更好的方法。

我希望我的解释和内联代码示例不会太混乱。实现所有这些所需的代码比我可以放在帖子中的代码更多。

FYI。我在堆栈溢出时看到了类似的线程,但没有一个能够充分回答这个问题。我也在网上看过客户端应用程序服务实现示例,但没有一个专门使用非Silverlight WPF。

那么是否有更好的方法允许我使用Thread.CurrentPrincipal进行登录/注销,这样就不需要我维护自己的Principal?

我感谢任何人都能提供的任何帮助或见解。

亲切的问候,

伯尼

0 个答案:

没有答案