开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?

[原文发表地址]  Beginning LightSwitch in VS 2012 Part 5: May I? Controlling Access with User Permissions

[原文发表时间] 2012-08-15 18:04

说明:本文是将之前所编的Visual Studio LightSwitch 2011 博文更新到Visual Studio 2012 中的LightSwitch 若要查看原文版本,请点击这里

欢迎来到开始Visual Studio 2012 中的 LightSwitch 系列的第5部分!在从第 1 到第4 部分中我们了解了实体、 关系、 屏幕Visual Studio LightSwitch中的查询。如果你错过了它们:

在这篇文章中,我想谈一谈用户权限, 也称为访问控制 。在大多数商务应用程序中,通常由于不同的职位功能或角色,我们需要限制系统中的用户可以访问哪些资源。例如,只有系统管理员可以向系统添加新的用户。应用程序中的某些数据和屏幕可能很敏感,应被限制访问,除非该用户具有该系统那部分的权限。LightSwitch 能轻松地定义用户的权限,并提供实体、 屏幕和查询之间的挂钩,从而允许你查看这些权限。

关于如何设置用户权限的视频演示,请参阅:我如何做的: 设置安全性来控制用户访问Visual Studio LightSwitch 应用程序的某些部分?

验证和授权

LightSwitch 应用程序需要两块信息来确定哪些用户应具有系统哪些部分的权限。首先,系统需要验证用户是否可以访问该应用程序。这称为验证。 换句话说:"证明你是你所说的谁"。LightSwitch中有两个支持验证类型:WindowsForms

Windows 验证是指应用程序基于Windows凭据而信任该用户。所以一旦用户成功登录到其 Windows 桌面中,这些凭据将自动传递到 LightSwitch 应用程序。Forms验证意味着应用程序请求一个自己的用户名和密码,完全独立于任何其它凭据。因此当你选择使用Forms验证时,一个登录屏幕将呈现给用户,用户每次访问该应用程序时,必须输入用户名和密码。

一旦用户进行身份验证了,应用程序可以通过阅读他们的用户权限来确定允许访问系统哪些部分。这被称为授权。换句话说:"现在,我知道你是谁,这儿是你在系统中可以做的"。

设置用户权限

这一切都是从项目属性中的Access Control(访问控制)选项卡开始的。要打开它,右击解决方案资源管理器中的项目名称,并从菜单中选择"属性"。

image

然后选择Access Control(访问控制)选项卡,指定你想要的验证类型,以及你想要定义的用户权限。

image

默认情况下,应用程序不会启用验证,所以在这里,你可以选择你要使用的身份验证类型。

使用Forms身份验证意味着你需要将用户名和加密的密码存储在 LightSwitch 数据库中。这种类型的身份验证适用于基于互联网的应用程序,那里用户不在同一网络中,你需要支持除Windows之外的其它操作系统。

如果你的所有用户都在同一网络/域或工作组中,就像在内部的业务线应用程序的情况下,使用 Windows 身份验证是合适的。这意味着无需将密码存储在LightSwitch 应用程序中。相应地Windows 登录凭据被使用了并自动传递给应用程序。如果你可以使用它,这是一种更安全、 更方便的选择。在这种情况下,你还可以选择是否要设置特定的用户和角色,或是否任何验证过的用户都可以访问该应用程序。

image

对于 Windows 身份验证两个最佳选择是:

  • 给管理应用程序的 Windows 用户特殊权限和角色。(如果你选择了 Windows 身份验证,它一直在启用状态。)
  • 此外,允许任何Windows 用户访问我的应用程序中未受保护的部分

下一步在代码中定义用户权限来访问资源 (我们会在下一步中用示例演示)。一旦你部署了该应用程序,SecurityAdministration权限总是为你定义好了,一旦你部署了应用程序,它就由LightSwitch所使用。当你部署时,LightSwitch 将创建一个具有此权限的单个用户,这将让他们可以访问所需的屏幕来定义系统中其余用户和角色。然而,在调试应用程序时,LightSwitch 不会登陆你的账号,因为每次构建并运行应用程序(按F5)时,这将是非常冗长乏味的。所以你可以使用“Granted for debug(授予调试”)复选框来指示哪些权限集应在调试会话中打开 / 关闭。

让我们通过在这个系列创建的通讯簿中执行一些关于安全性的操作来做下示范。

在通讯簿应用程序中检查用户权限

让我们从选择验证方案开始。由于此应用程序将会用于一家小型企业来管理他们的所有联系人,我将选择 Windows验证。我也可以选择"允许任何经过验证的 Windows 用户"进入系统,那样在默认情况下,公司的每个人都可以搜索和编辑联系人。不过,为了添加或删除联系人,用户将需要特殊的权限来做到这一点。

因此我们需要创建两个新的权限。你可以将权限命名为任何你想要的。你只能在代码中看到名称。当系统管理员设置了用户和角色后时,他们会在屏幕上看到显示名称,所以添加两个权限 ;CanAddContacts 和 CanDeleteContacts。

image

 

下一步,为这两个权限取消勾选"授权调试",那样我们可以测试它们是正常运行的。当你取消勾选它时,不会授予此权限。这使得我们在调试时可以轻松地测试权限组合。若要在调试时查看用户和角色屏幕,你可以为 SecurityAdministration启用它。既然我们已经在这里设置好了这些权限,我们需要在代码中检查它们。正如我所提到的,LightSwitch为你提供了方法,因此,当你需要各种自定义验证和商务规则,包括访问控制时,你可以编写代码。

关于在 LightSwitch 中编写代码的详细信息,请参阅库中的使用代码执行数据相关的任务主题

关于编写自定义商务规则的详细信息,请参阅: LightSwitch 商务应用程序中的常见验证规则

为了执行安全性,我们需要编写几行代码来检查这些权限。LightSwitch 提供关于实体、 屏幕和查询的访问控制方法。若要访问这些方法,下拉任何设计器右上角的列表,选择“Write code(编写代码)” ,你将在列表中看到“Access Control Methods(访问控制方法)” 部分。当你想要限制查看 (阅读),插入 (添加),编辑或删除实体时,打开数据设计器中的实体,然后下拉“编写代码” 按钮,再选择适当的访问控制方法。

image

至于此应用程序,选择Contacts_CanDelete 方法,这将打开代码编辑器到该方法存根的地方。你需要做的就是写一行代码 (下面以粗体显示) 来检查你设置的 CanDeleteContacts 权限:

VB:

 Namespace LightSwitchApplication 
    Public Class ApplicationDataService 
        Private Sub Contacts_CanDelete(ByRef result As Boolean) 
            'Add this one line of code to verify the user has permission to delete contacts: result = Me.Application.User.HasPermission(Permissions .CanDeleteContacts)   
        End Sub 
    End Class 
End Namespace 

C#:

 namespace LightSwitchApplication 
{ 
    public partial class ApplicationDataService 
    { 
        partial void Contacts_CanDelete(ref bool result) 
        { 
            //Add this one line of code to verify the user has permission to delete contacts: 
             result =  this.Application.User.HasPermission(Permissions .CanDeleteContacts);   
        } 
    } 
}

现在回到设计器中的"编写代码"按钮,选择 Contacts_CanInsert ,然后类似地编写下面的代码行(以粗体显示) 来检查CanAddContacts的 权限:

VB:

 Namespace LightSwitchApplication
    Public Class ApplicationDataService 
        Private Sub Contacts_CanDelete(ByRef result As Boolean)
            'Add this one line of code to verify the user has permission to delete contacts: 
            result = Me.Application.User.HasPermission(Permissions.CanDeleteContacts)

        End Sub 
        Private Sub Contacts_CanInsert(ByRef result As Boolean)
            'Add this one line of code to verify the user has permission to add contacts: result = Me.Application.User.HasPermission(Permissions.CanAddContacts) 
        End Sub 
    End Class 
End Namespace 

C#:

 using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.LightSwitch; 
using Microsoft.LightSwitch.Security.Server; 
namespace LightSwitchApplication 
{ 
    public partial class ApplicationDataService 
    { 
        partial void Contacts_CanDelete(ref bool result) 
        {  
            //Add this one line of code to verify the user has permission to delete contacts:  
            result = this.Application.User.HasPermission(Permissions.CanDeleteContacts); 
        } 
        partial void Contacts_CanInsert(ref bool result) 
        {  
            //Add this one line of code to verify the user has permission to delete contacts: 
             result = this.Application.User.HasPermission(Permissions .CanAddContacts);   
        } 
    } 
}

你可能想知道为什么我们要在实体中检查这些权限,而不是在屏幕上。在实体中检查权限能保证无论用户在使用哪些屏幕时,数据操作都能受到保护。如果你需要在应用程序中执行用户权限,最佳做法是记住首先要确保你的实体安全。然而,我们的应用程序还有一个" Create New Contact(创建新的联系人)"屏幕,如果他们没有权限将联系人添加到系统中,我们则不想在菜单上显示给用户。如果我们忘记了从菜单中隐藏此屏幕,那么用户将能够打开它并填写数据。不过,当它们单击保存时,上述Contacts_CanInsert 方法将运行并阻止实际数据的存储。

所以为了从导航菜单中隐藏此屏幕,我们需要添加更多的检查。双击解决方案资源管理器中的CreateNewContact 屏幕来打开屏幕设计器。下拉右上方的"编写代码"按钮,你将看到一个针对屏幕的可用Access Control方法:

image

选择CreateNewContact_CanRun 方法,编写以下代码行(以粗体显示):

VB:

 Namespace LightSwitchApplication
    Public Class Application 
        Private Sub CreateNewContact_CanRun(ByRef result As Boolean)
            'Add this one line of code to verify the user has permission to run the screen: result = Me.User.HasPermission(Permissions.CanAddContacts) 
        End Sub 
    End Class 
End Namespace 

C#:

 namespace LightSwitchApplication 
{ 
    public partial class Application 
    { 
        partial void CreateNewContact_CanRun(ref bool result) 
        { 
            //Add this one line of code to verify the user has permission to run the screen: result = this.User.HasPermission(Permissions .CanAddContacts);   
        } 
    } 
}

 

运行它

既然我们已准备好测试该应用程序,那么按 F5来生成以及运行它。由于我们没有授予调试CanAddContacts 和 CanDeleteContacts权限,你首先将注意到 CreateNewContact 屏幕没有显示在菜单上。显示的第一个屏幕是我们在第 4 部分中创建的自定义搜索屏幕。如果你单击一个联系人,details屏幕将会打开,允许用户编辑该联系人的信息。为了查看我们是否不能删除或添加新联系人,让我们对搜索屏幕做一个小小的更改。在search屏幕被打开时,单击右上角的"屏幕设计"按钮来打开屏幕定制模式。

image

 

在左侧内容树中,展开数据网格下的命令栏,然后添加两个命令 ;DeleteSelected 和 AddAndEditNew。

image

单击Save 按钮(ctrl + shift + S)来保存并退出定制模式,并注意命令被禁用了。由于我们没有权限来添加或删除联系人,这种行为是正确的。也因为我们是在实体级别检查这些权限,所有的屏幕命令都正常运行,不需要额外代码。 如果你退回到项目属性的Access Control选项卡,你可以勾选你要测试的权限组合,你将会看到所有命令都正确地启用/禁用。

用户和角色屏幕

在我们总结之前,我想快速浏览一下用户和角色屏幕。当你为调试启用SecurityAdministration 权限时,这些屏幕在菜单上是可用的。但是,请记住,放入这些屏幕的数据在调试时并没有使用。直到你部署应用程序使用这些屏幕,这些数据才会被使用。所以将数据放入这些屏幕仅仅出于演示目的。当第一次部署你的应用程序时,LightSwitch 将询问管理员的用户名和密码,它将部署到用户表中,并授予 SecurityAdministration 权限。然后该管理员可以输入可以进入该系统的其他用户。

首先定义角色,然后使用角色屏幕为该角色添加你所定义的权限。

image

然后你可以使用用户屏幕来添加新用户和活动目录组,并将他们分配给合适的角色。如果你分配一个角色给AD(活动目录组),然后添加该组的一名用户到系统中,LightSwitch会提示继承该用户所在组的哪些角色。

image

总结

正如你看到的,在Visual Studio LightSwitch中定义和检查用户权限是一个简单但重要的任务。在专业的商务应用程序中,访问控制是一个很常见的要求,LightSwitch 提供了一个简单的方法来使用框架,通过方法将实体、 屏幕和查询挂钩,锁定了应用程序的所有部分。一旦你部署你的应用程序,系统管理员可以开始设置用户和角色来控制访问你的应用程序的安全部分。

关于用户权限和部署应用程序的详细信息,请参阅LightSwitch 开发人员中心上的使用用户权限和部署 LightSwitch 应用程序主题.

在下一篇文章中,我们将讨论主题以及通过安装 LightSwitch 扩展如何更改应用程序的外观和感觉。我们将看看什么是可用且免费的,以及一些看起来很棒但很便宜的扩展。下一次再见!

希望大家喜欢 !