WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2

时间:2022-11-04 12:45:22

如何:在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模板,并制定一个名字。

  WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2
   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。

WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2代码
 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方法。包含了一个回调函数来对登录操作的结果做反应。

WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2代码
 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方法来登出用户。

WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2代码
 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属性。下面的代码展示了在检索个性化信息和调用域操作之前,先检测是否当前用户已经验证了。

WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2代码
 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