如何:在RIA Services中允许进行身份验证
WCF RIA Services中的身份验证是建立在ASP.NET验证框架之上的。
本章节展示如后在我们的应用程序中通过RIA Services来允许用户身份验证。我们必须在服务端和客户端添加代码,来使身份验证可行。这个验证对客户端就如同一个服务。我们可以通过对域操作应用 RequiresAuthenticationAttribute属性,来保证只有验证用户可以访问域操作。
配置服务端项目
1. 在服务端项目中,打开Web.config文件。
2. 在元素中,添加元素。
3. 设置mode属性为我们想在项目中使用的验证模式。下面的代码展示了mode属性设置为Forms的元素。当然,我们的Web.config文件可能包含其他元素。
2 <authentication mode="Forms"></authentication>
3 </system.web>
4. 保存Web.config文件。
5. 在资源管理器中,右键点击服务端项目,选择"添加->新项"。出现"添加新项"对话框。
6. 选择Authentication Domain Service模板,并制定一个名字。
7. 点击"添加"。
8. 如果想只有验证用户可以访问域操作,对域操作应用RequiresAuthenticationAttribute属性。下面代码展示了只有验证用户才可以访问GetSalesOrderHeaders方法。
2 public IQueryable<salesorderheader> GetSalesOrderHeaders()
3 {
4 return this.ObjectContext.SalesOrderHeaders;
5 }
9. 生成解决方案。
在客户端配置身份验证服务
1. 在客户端项目中,打开App.xaml文件。
2. 在application lifetime 对象集合中添加当前的WebContext对象。下面的app前缀引用包含生成的WebContext对象的命名空间。通常,这个WebContext用的是客户端项目的基命名空间。
2 <app:webcontext>
3 </app:webcontext>
4 </application.applicationlifetimeobjects>
3. 在WebContext元素内,添加验证模式。
我们可以添加WindowsAuthentication或者 FormsAuthentication。然而,我们添加的类型应该与服务端的验证模式一致。下面展示了如何添加 FormsAuthentication。
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方法。包含了一个回调函数来对登录操作的结果做反应。
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方法来登出用户。
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属性。下面的代码展示了在检索个性化信息和调用域操作之前,先检测是否当前用户已经验证了。
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实例添加到应用程序资源中。
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