神仙?妖怪?谢谢!

Just do it...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

如何:在RIA Services中允许进行身份验证
WCF RIA Services中的身份验证是建立在ASP.NET验证框架之上的。
本章节展示如后在我们的应用程序中通过RIA Services来允许用户身份验证。我们必须在服务端和客户端添加代码,来使身份验证可行。这个验证对客户端就如同一个服务。我们可以通过对域操作应用 RequiresAuthenticationAttribute属性,来保证只有验证用户可以访问域操作。

 

配置服务端项目

   1.  在服务端项目中,打开Web.config文件。
   2.  在元素中,添加元素。
   3.  设置mode属性为我们想在项目中使用的验证模式。下面的代码展示了mode属性设置为Forms的元素。当然,我们的Web.config文件可能包含其他元素。

1 <system.web>  
2   <authentication mode="Forms"></authentication>  
3 </system.web>

 

   4.  保存Web.config文件。
   5.  在资源管理器中,右键点击服务端项目,选择"添加->新项"。出现"添加新项"对话框。
   6.  选择Authentication Domain Service模板,并制定一个名字。

  
   7.  点击"添加"。
   8.  如果想只有验证用户可以访问域操作,对域操作应用RequiresAuthenticationAttribute属性。下面代码展示了只有验证用户才可以访问GetSalesOrderHeaders方法。

1 [RequiresAuthentication()]   
2 public IQueryable<salesorderheader> GetSalesOrderHeaders()   
3 {   
4     return this.ObjectContext.SalesOrderHeaders;   
5 }  

 

   9.  生成解决方案。

 

在客户端配置身份验证服务

   1.  在客户端项目中,打开App.xaml文件。
   2.  在application lifetime 对象集合中添加当前的WebContext对象。下面的app前缀引用包含生成的WebContext对象的命名空间。通常,这个WebContext用的是客户端项目的基命名空间。

1 <application.applicationlifetimeobjects>  
2   <app:webcontext>  
3   </app:webcontext>  
4 </application.applicationlifetimeobjects>

 

   3.  在WebContext元素内,添加验证模式。
我们可以添加WindowsAuthentication或者 FormsAuthentication。然而,我们添加的类型应该与服务端的验证模式一致。下面展示了如何添加 FormsAuthentication。

代码
 1 <application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">  
 2              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
 3              xmlns:app="clr-namespace:ExampleApplication"  
 4              xmlns:appsvc="clr-namespace:System.Windows.Ria.ApplicationServices;assembly=System.Windows.Ria"  
 5              x:Class="ExampleApplication.App">  
 6     <application.resources>  
 7     </application.resources>  
 8     <application.applicationlifetimeobjects>  
 9         <app:webcontext>  
10             <app:webcontext.authentication>  
11                 <appsvc:formsauthentication></appsvc:formsauthentication>  
12             </app:webcontext.authentication>  
13         </app:webcontext>  
14     </application.applicationlifetimeobjects>  
15 </application>

 

   4.  如果必要的话,在客户端添加一个页面来收集用户凭证。
   5.  在登录页面的后台代码文件中,调用Login方法来登录用户。下面的例子展示了如何从登录按钮的事件处理中调用Login方法。包含了一个回调函数来对登录操作的结果做反应。

代码
 1 private void LoginButton_Click(object sender, RoutedEventArgs e)   
 2 {   
 3     LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);   
 4     WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);   
 5     LoginButton.IsEnabled = false;   
 6     LoginResult.Text = "";   
 7 }   
 8 private void LoginOperation_Completed(LoginOperation lo)   
 9 {   
10     if (lo.HasError)   
11     {   
12         LoginResult.Text = lo.Error.Message;   
13         LoginResult.Visibility = System.Windows.Visibility.Visible;   
14         lo.MarkErrorAsHandled();   
15     }   
16     else if (lo.LoginSuccess == false)   
17     {   
18         LoginResult.Text = "Login failed. Please check user name and password.";   
19         LoginResult.Visibility = System.Windows.Visibility.Visible;   
20     }   
21     else if (lo.LoginSuccess == true)   
22     {   
23         SetControlVisibility(true);   
24     }   
25     LoginButton.IsEnabled = true;   
26 }

 

   6. 调用Logout方法来登出用户。

代码
 1 private void LogoutButton_Click(object sender, RoutedEventArgs e)   
 2 {   
 3     WebContext.Current.Authentication.Logout(this.LogoutOperation_Completed, null);   
 4 }   
 5 private void LogoutOperation_Completed(LogoutOperation lo)   
 6 {   
 7     if (!lo.HasError)   
 8     {   
 9         SetControlVisibility(false);   
10     }   
11     else  
12     {   
13         ErrorWindow ew = new ErrorWindow("Logout failed.""Please try logging out again.");   
14         ew.Show();   
15         lo.MarkErrorAsHandled();   
16     }   
17 }

 

   7.  要检测是否用户已登录,检索生成的User实体的IsAuthentication属性。下面的代码展示了在检索个性化信息和调用域操作之前,先检测是否当前用户已经验证了。

代码
 1 private void LoadReports()   
 2 {   
 3     if (WebContext.Current.User.IsAuthenticated)   
 4     {   
 5         numberOfRows = WebContext.Current.User.DefaultRows;   
 6         WebContext.Current.User.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(User_PropertyChanged);   
 7         LoadRestrictedReports();   
 8     }   
 9     else  
10     {   
11         CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;   
12         SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed;   
13     }   
14     LoadOperation<product> loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows));   
15     ProductsGrid.ItemsSource = loadProducts.Entities;   
16 }

 

   8.  如果想让WebContext对象在XAML中可用,那么在创建RootVisual之前,在Application.Startup事件中把当前 WebContext实例添加到应用程序资源中。

1 private void Application_Startup(object sender, StartupEventArgs e)   
2 {   
3     this.Resources.Add("WebContext", WebContext.Current);   
4     this.RootVisual = new MainPage();   
5 }

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2010/04/08/5462238.aspx

posted on 2010-06-05 15:12  E.Trock  阅读(849)  评论(0编辑  收藏  举报