如何:启用 RIA Services 中的角色

本主题演示如何在之前已启用身份验证的情况下在 WCF RIA Services 解决方案中启用角色。只能在某个用户的身份得到验证后检索此用户的角色。若要配置解决方案进行身份验证,请参见如何:在 RIA Services 中启用身份验证。可以将 RequiresRoleAttribute 特性应用于一个域操作的方法,以限制只有某个角色的成员可以访问该域操作。

角色用于指定哪一组经身份验证的用户可访问特定资源。RIA Services 中的角色基于 ASP.NET 中的角色构建。有关角色的更多信息,请参见了解角色管理

配置服务器项目

  1. 在服务器项目中,打开 Web.config 文件。

  2. <system.web> 部分中,通过添加 <roleManager> 元素来启用 Manager 角色。

    下面的示例演示如何启用 Manager 角色。

    <system.web>
      <authentication mode="Forms"></authentication>
      <roleManager enabled="true"></roleManager>
    </system.web>
    
  3. 在成员资格数据库中,创建所需的角色,并根据需要将用户分配给角色。

    有关更多信息,请参见了解角色管理。有关创建角色的示例,请参见演练:将身份验证服务用于 Silverlight 业务应用程序演练:将身份验证服务用于 Silverlight 导航应用程序

  4. 若要仅允许某个指定角色的成员访问域操作,请将 RequiresRoleAttribute 特性应用于该域操作。

    下面的示例指定仅“Managers”角色的成员可以访问此域操作。

    <RequiresRole("Managers")> _
    Public Function GetCustomers() As IQueryable(Of Customer)
        Return Me.ObjectContext.Customers
    End Function
    
    [RequiresRole("Managers")]
    public IQueryable<Customer> GetCustomers()
    {
        return this.ObjectContext.Customers;
    }
    

访问客户端项目中的角色

  1. 若要检查用户是否属于所需角色,请访问 Roles 属性或对 WebContext.Current.User 对象调用 IsInRole 方法。

    下面的示例会在调用域操作之前,检查用户是否属于一个名为 Managers 的角色。

    Private Sub LoadRestrictedReports()
        Dim loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows))
        SalesOrdersGrid.ItemsSource = loadSales.Entities
        SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible
    
        If (WebContext.Current.User.IsInRole("Managers")) Then
            Dim loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows))
            CustomersGrid.ItemsSource = loadCustomers.Entities
            CustomersGrid.Visibility = System.Windows.Visibility.Visible
        Else
            CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
        End If
    End Sub
    
    private void LoadRestrictedReports()
    {
        LoadOperation<SalesOrderHeader> loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows));
        SalesOrdersGrid.ItemsSource = loadSales.Entities;
        SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible;
    
        if (WebContext.Current.User.IsInRole("Managers"))
        {
            LoadOperation<Customer> loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows));
            CustomersGrid.ItemsSource = loadCustomers.Entities;
            CustomersGrid.Visibility = System.Windows.Visibility.Visible;
        }
        else
        {
            CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;
        }
    }
    
  2. 如果您希望使 WebContext 对象在 XAML 中可用,请在创建根 Visual 之前,将当前 WebContext 实例添加到 Application.Startup 事件中的应用程序资源。

    下面的示例演示如何将 WebContext 实例添加为应用程序资源。

    Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
        Me.Resources.Add("WebContext", WebContext.Current)
        Me.RootVisual = New MainPage()
    End Sub
    
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        this.Resources.Add("WebContext", WebContext.Current);
        this.RootVisual = new MainPage();
    }
    

另请参见

任务

演练:将身份验证服务用于 Silverlight 导航应用程序
演练:将身份验证服务用于 Silverlight 业务应用程序