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

WCF RIA 服务 (三十五)-- 身份验证、角色、个性化 6,第1张

概述演练:在Silverlight Business应用程序中使用身份验证服务 Silverlight Business应用程序模板创建的解决方案自动允许身份验证(验证模式为Forms),角色个性化功能。解决方案包含了数据表格来登录已经存在的用户 和注册新用户。我们不用写额外的代码就可以使用这些特性。我们也可以通过定义角色、个性化属性来自定 义解决方案。 在本演练中,我们将学习 如何在Silverl

演练:在Silverlight Business应用程序中使用身份验证服务
Silverlight Business应用程序模板创建的解决方案自动允许身份验证(验证模式为Forms),角色和个性化功能。解决方案包含了数据表格来登录已经存在的用户 和注册新用户。我们不用写额外的代码就可以使用这些特性。我们也可以通过定义角色、个性化属性来自定


义解决方案。

在本演练中,我们将学习 如何在Silverlight Business应用程序中使用身份验证、角色和个性化功能。我们将根据用户的凭证来限制对某些域 *** 作的访问,并根据用户的偏好来定制用户界面。我们将使 用ASP.NET网站管理工具来管理角色和用户。

创建网站、用户、角色
我们可以使用 Silverlight Business应用程序模板提供的特性,来快速实施验证功能。在下面的章节,我们使用ASP.NET配置工具来创建用户和角色,并登陆此用户。我们还通 过Silverlight Business应用程序提供的注册表格来注册新用户。

1. 在Visual Studio中,选择"文件->新建->项目"."新建项目"对话框打开。
2. 选择Silverlight项目类型。
3. 选择Silverlight Business Application模板,并命名为ExampleBusinessApplication.


4. 点击"OK".注意创建的项目结构。这个SL客户端项目中在VIEws文件夹中包含了SL页面。这些页面允许登陆用户和注册新用户。
5. 打开ASP.NET 网站管理工具。(首先,在资源管理器中,选择服务端项目,然后打开ASP.NET配置工具。
6. 在项目菜单中,选择ASP.NET Configuration.如果在项目菜单中,看不到ASP.NET Configuration选项,有可能是选择了客户端项目。


7.在ASP.NET网站管理工具中选择"安全"标签。


8. 在"角色"的部分,点击"创建或管理角色"链接。
9. 添加一个名为Managers的角色,并点击"添加角色"按钮。


10. 在右下角,点击"返回"按钮。
11. 在“用户"的部分,点击"创建用户"按钮。
12. 使用下面的值来创建新用户,并选择Managers角色复选框。
- User name : CustomerManager
- Password : P@ssword
- E-mail : [email protected]
- Security Question : Favorite color?
- Security Answer : Blue
- Managers role : selected


13. 点击"创建用户"按钮。
14. 关闭ASP.NET网站管理工具。
15. 运行解决方案。应用程序的首页将会显示在web浏览器中。
16. 在页面的右上角,点击”登陆"链接。登陆窗口将会出现。
17. 为用户名称输入CustomerManager,为密码输入p@ssword,并点击"OK"按钮。


现在我们就登陆这个用户了,注意到在页面右上角出现文本"Welcome CustomerManager"。
18. 点击"登出"按钮。这时我们就不再以CustomerManager登陆了。
下面的步骤,我 们通过注册表格创建一个新用户。
19. 再次点击"登陆"链接。
20. 在登陆对话框中,点击"现在就注册"链接。注册表格就会出现了。
21. 用下面的信息填充注册表。
Username: SalesUser

FrIEndly name: SalesUser

Email: [email protected]

Password: P@ssword

Security Question: What was the color of your first car?

Security Answer: Green


22. 点击"OK",创建一个新用户。注意,我们现在已经作为SalesUser登陆了。
23. 关闭浏览器。
24. 打开ASP.NET网站管理工具,点击"安全"标签。注意到已经有了两个用户和角色,即使我们只创建了一个角色。
25. 点击“创建或管理角色”,注意到Managers和Registered Users角色。Registered User角色是Business应用程序模板自动生成的。


26. 对"Registered Users",点击"管理"链接。注意,通过应用程序添加的名为SalesUser的用户已经在Registered Users角色中了。
27. 关闭ASP.NET网站管理工具。

定义访问权限和个性化属性

我们通过为域服务应用 RequiresAuthenticationAttribute和RequiresRoleAttribute属性,来限制对域服务的访问。如果域 *** 作 没有属性,对所有用户有效。在域 *** 作上添加属性,并不能阻止用户调用域 *** 作。只是没有所需凭证的用户会收到一个异常。

根据角色限制显示数 据
1. 在资源管理器中,在服务端项目中,点击App_Data文件夹,选择"添加->已存在项"。
2. 在"添加已存在项"对话框中,添加AdventureWorksLT示例数据库。
3. 在服务端,添加一个新项,并选择ADO.NET Entity Data Model模板。
4. 命名模型为AdventureWorksModel.edmx,并点击"添加"."实体数据模型向导"将会出现。
5. 选择"从数据库生成"选项,并点击"下一步".
6. 选择AdventureWorksLT数据库,并点击"下一步"。
7. 从数据库对象列表中,选择Customer,Product,以及SalesOrderheader表,然后点击"完成"。实体数据模型将会出现在设计器 中。
8. 生成解决方案。
9. 在服务端,添加一个新项,并选择Domain Service Class模板。
10. 命名为AdventureWorksDomainService,然后点击"添加"。
11. 在"添加新域服务类"对话框中,选择Customer,Product和SalesOrderheader实体。


12. 点击"OK"以完成创建域服务。
13. 在AdventureWorksDomainService类中,对GetSalesOrderheader方法添加 RequiresAuthenticationAttribute属性。



14. 对GetCustomers方法添加RequiresRoleAttribute属性,并设置所需的角色为"Managers"。



GetProducts 方法对所有用户都可用,GetSalesOrderheader只对验证用户可用,GetCustomers方法只对属于Managers角色的用户可 用。




下 面我们在Web.config文件中定义个性法属性。当我们把属性添加到服务端的用户类时,将会为客户端项目生成对应的属性。

1. 在服务端项目,打开Web.config文件。
2. 在元素内,添加名为DefaultRows的个性化属性。这个属性将保持 用户对显示的数据数量的偏爱。

3. 保存Web.config文件。
4. 在服务端项目中,展开Models文件夹。
5. 打开User.cs或User.vb文件,添加名为DefaultRows属性。




从 客户端使用身份验证服务
在调用有限制权限的域 *** 作时,我们应该对用户检查所需的凭证。否则,将会抛出一个异常。在下面的部分, 我们将检查用户的凭证,并根据用户的凭证来填充一个到三个DataGrID控件。我们会根据用户个性化中的属性来得到显示的记录数量。对没有验证的用户, 默认的值是10。这部分没有让用户更改DefaultRows个性化属性的方式,不过在以后的部分会添加这个方式。

添加一个 Silverlight页面来显示数据
1. 在客户端,在VIEws文件夹中添加新项。
2. 选择Silverlight Page模板,并命名为Reports.xaml。
3. 打开MainPage.xaml文件,并名为link2的超链接按钮下面添加一个指向Reports页面的链接。



4. 在Assets/Resources文件夹内,打开ApplicationString.resx文件。
5. 添加一个新的名为ReportsPageTitle的字符串资源,并设置值为Reports。


6. 保存并关闭ApplicationString.resx文件。
7. 打开Reports.xaml文件,并添加如下XAML到GrID元素内。



8. 拖拽三个DataGrID控件到名为ContentStackPanel的stack面板内。当我们从工具栏中拖拽DataGrID控件时,会在项目中添 加一个对Sy@[email protected]程序集的应用,并在页面内添加Sy@[email protected]命名空 间。
9. 命名DataGrID控件为ProductsGrID、SalesOrdersGrID、CustomerGrID。
10. 对每个DataGrID控件,设置margin为5.



11. 打开Reports.xaml.cs或Reports.xaml.vb。
12. 对c#,用using添加 Sy@[email protected],Sy@[email protected],ExampleBusinessApplication.Web,和ExampleBusinessApplication.Resources命名空间。
13. 创建AdventureWorksDomainService的名为context的实例,并创建一个名为numberOfRows的变量来保存检索的记 录数量。



14. 添加一个名为LoadRestrictedReports的方法,这个方法调用GetSalesOrderheaderquery方法和 GetCustomerquery方法。如果用户属于Managers角色,就显示对应的带结果的数据表格。
如果没有所需凭证的用户调用一个域 *** 作时,域 *** 作会返回一个异常。我们可以通过在调用域 *** 作之前检查凭证来避免这种情况。



15. 添加名为LoadReports的方法来检测是否用户已验证,如果已验证,就调用LoadRestricteReports方法。它还检索名为 DefaultRows的个性化属性,并对User对象的PropertyChanged事件添加事件处理程序。最后,对所有用户调用 GetProductsquery方法。



16. 对PropertyChanged事件添加事件处理程序,保证在DefaultRows属性改变时调用LoadReports方法。



17. 为LoggedIn和LoggedOut事件添加事件处理方法,并根据用户凭证的状况装载或隐藏数据。


18. 在构造函数内添加下面的代码:



以 下是完整代码


19. 运行解决方案。
20. 点击Reports链接。注意到,当我们没登陆时,只有产品表显示在报告页面。
21. 点击"登陆"链接,并以SalesUser登陆。会发现,产品和销售订单表显示出来。


22. 登出并以CustomerManager登陆。会发现,三个表都显示了。
23. 关闭web浏览器。

添加一个窗口来设置个性化属性
我们可以通过添加一个子窗口来允许用户编 辑DefaultRows个性属性。当值改变后,我们调用SaveUser方法来把值保存到数据源。我们通过当前WebContext实例的User对象 上的属性来检索当前的值。
1. 在客户端,在VIEws文件夹中添加新项。
2. 选择Silverlight Child Window模板,并命名为ProfileWindow.xaml。

3. 点击"添加"按钮。
4. 在ProfileWindow.xaml文件内,在GrID.RowDeFinitions元素后添加XAML,来添加一个下拉列表选择要在报表中显示的 行数。

view source print ? @H_502_389@01 < stackpanel orIEntation @H_38_403@= "Horizontal" grID.row @H_38_403@= "0" @H_38_403@> @H_502_389@02      @H_38_403@< textblock text @H_38_403@= "Number of rows to display for reports: " @H_38_403@></ textblock @H_38_403@> @H_502_389@03      @H_38_403@< comboBox x:name @H_38_403@= "defaultRows" height @H_38_403@= "20" verticalalignment @H_38_403@= "top" @H_38_403@> @H_502_389@04          < comboBoxitem content @H_38_403@= "1" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@05          < comboBoxitem content @H_38_403@= "2" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@06          < comboBoxitem content @H_38_403@= "3" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@07          < comboBoxitem content @H_38_403@= "4" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@08          < comboBoxitem content @H_38_403@= "5" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@09          < comboBoxitem content @H_38_403@= "6" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@10          < comboBoxitem content @H_38_403@= "7" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@11          < comboBoxitem content @H_38_403@= "8" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@12          < comboBoxitem content @H_38_403@= "9" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@13          < comboBoxitem content @H_38_403@= "10" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@14          < comboBoxitem content @H_38_403@= "15" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@15          < comboBoxitem content @H_38_403@= "20" @H_38_403@></ comboBoxitem @H_38_403@> @H_502_389@16      @H_38_403@</ comboBox @H_38_403@> @H_502_389@17 @H_38_403@</ stackpanel @H_38_403@>


5. 设置ChilDWindow的Title属性为Select References。
6. 在ProfileWindow.xaml.cs中,添加下面的代码来检索和设置个性化属性。

view source print ? @H_502_389@01 public partial class ProfileWindow : ChilDWindow @H_502_389@02 { @H_502_389@03      public ProfileWindow() @H_502_389@04      { @H_502_389@05          InitializeComponent(); @H_502_389@06   @H_502_389@07          string userDefaultRows = WebContext.Current.User.DefaultRows.ToString(); @H_502_389@08          foreach (ComboBoxItem cbi in defaultRows.Items) @H_502_389@09          { @H_502_389@10              if (cbi.Content.ToString() == userDefaultRows) @H_502_389@11              { @H_502_389@12                  defaultRows.SelectedItem = cbi; @H_502_389@13                  break ; @H_502_389@14              } @H_502_389@15          } @H_502_389@16      } @H_502_389@17   @H_502_389@18      private voID OKbutton_Click( object sender,RoutedEventArgs e) @H_502_389@19      { @H_502_389@20          int newSelection = int .Parse(defaultRows.SelectionBoxItem.ToString()); @H_502_389@21          if (newSelection != WebContext.Current.User.DefaultRows) @H_502_389@22          { @H_502_389@23              WebContext.Current.User.DefaultRows = newSelection; @H_502_389@24              WebContext.Current.Authentication.SaveUser( true ); @H_502_389@25          } @H_502_389@26          this .DialogResult = true ; @H_502_389@27      } @H_502_389@28   @H_502_389@29      private voID Cancelbutton_Click( object sender,RoutedEventArgs e) @H_502_389@30      { @H_502_389@31          this .DialogResult = false ; @H_502_389@32      } @H_502_389@33 }


7. 如果是VB,添加imports命令引用Sy@[email protected]和Sy@[email protected]命名空间。
8. 展开VIEws/Login文件夹,并打开LoginStatus.xaml文件。
9. 添加一个指向profile文件的设置链接,在logout按钮前添加下面的XAML

view source print ? @H_502_389@1 < button x:name @H_38_403@= "Settingsbutton" click @H_38_403@= "Settingsbutton_Click" content @H_38_403@= "settings" style @H_38_403@= "" margin @H_38_403@= "0,0" @H_38_403@></ button @H_38_403@> @H_502_389@2 @H_38_403@< textblock text @H_38_403@= "  |  " style @H_38_403@= "" @H_38_403@> @H_502_389@3 @H_38_403@</ textblock @H_38_403@>


10. 在LoginStatus.xaml.cs文件内,为设置链接添加点击事件处理方法。

view source print ? @H_502_389@1 private voID Settingsbutton_Click( object sender,RoutedEventArgs e) @H_502_389@2 { @H_502_389@3      ExampleBusinessApplication.VIEws.ProfileWindow settingsWindow = new ExampleBusinessApplication.VIEws.ProfileWindow(); @H_502_389@4      settingsWindow.Show(); @H_502_389@5 }


11. 运行解决方案。
12. 以CustomerManager或SalesUser登陆,注意到在登陆状态栏,现在包含一个"设置"的链接。


13. 点击"设置"链接,并设置默认的报表显示行数。

14. 打开报表页面,会注意到DataGrID现在包含我们所选的行数。

总结

以上是内存溢出为你收集整理的WCF RIA 服务 (三十五)-- 身份验证、角色、个性化 6全部内容,希望文章能够帮你解决WCF RIA 服务 (三十五)-- 身份验证、角色、个性化 6所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1034204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存