使用 Forms 身份验证对用户进行身份验证 (VB)

Microsoft

了解如何使用 [Authorize] 属性对 MVC 应用程序中的特定页面进行密码保护。 了解如何使用网站管理工具创建和管理用户和角色。 还将了解如何配置用户帐户和角色信息的存储位置。

本教程的目的是说明如何使用 Forms 身份验证对 ASP.NET MVC 应用程序中的视图进行密码保护。 了解如何使用网站管理工具创建用户和角色。 你还将了解如何防止未经授权的用户调用控制器操作。 最后,了解如何配置用户名和密码的存储位置。

使用网站管理工具

在执行任何其他操作之前,应先创建一些用户和角色。 创建新用户和角色的最简单方法是利用 Visual Studio 2008 网站管理工具。 可以通过选择菜单选项 “项目”、“ASP.NET 配置”来启动此工具。 或者,可以通过单击 (有点吓人的) 锤子图标来启动网站管理工具,该图标显示在解决方案资源管理器窗口顶部, (见图 1) 。

图 1 - 启动网站管理工具

clip_image002[4]

在网站管理工具中,通过选择“安全性”选项卡创建新用户和角色。单击“ 创建用户” 链接以创建名为 Stephen 的新用户 (请参阅图 2) 。 为 Stephen 用户提供所需的任何密码 (例如 机密) 。

图 2 - 创建新用户

clip_image004[4]

通过首先启用角色并定义一个或多个角色来创建新角色。 通过单击“启用角色 ”链接启用角色 。 接下来,通过单击“创建”或“管理角色”链接创建名为“管理员”的角色 (请参阅图 3) 。

图 3 - 创建新角色

clip_image006[4]

最后,创建名为 Sally 的新用户并将 Sally 与管理员角色相关联,方法是单击“创建用户”链接,然后在创建 Sally 时选择“管理员” (请参阅图 4) 。

图 4 - 将用户添加到角色

clip_image008[4]

说完所有操作后,你应该有两个名为 Stephen 和 Sally 的新用户。 还应具有名为“管理员”的新角色。 Sally 是管理员角色的成员,Stephen 不是。

需要授权

可以通过将 [Authorize] 属性添加到操作,要求在用户调用控制器操作之前对用户进行身份验证。 可以将 [Authorize] 属性应用于单个控制器操作,也可以将此属性应用于整个控制器类。

例如,清单 1 中的控制器公开了名为 CompanySecrets () 的操作。 由于此操作是使用 [Authorize] 属性修饰的,因此除非对用户进行身份验证,否则无法调用此操作。

列表 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        Return View()
    End Function

    <Authorize()> _
    Function CompanySecrets()
        Return View()
    End Function

End Class

如果在浏览器的地址栏中输入 URL /Home/CompanySecrets 来调用 CompanySecrets () 操作,并且你不是经过身份验证的用户,则会自动重定向到登录视图 (见图 5) 。

图 5 - 登录视图

clip_image010[4]

可以使用“登录”视图输入用户名和密码。 如果你不是注册用户,则可以单击 注册 链接导航到“注册”视图 (见图 6) 。 可以使用“注册”视图创建新的用户帐户。

图 6 - 寄存器视图

clip_image012

成功登录后,可以看到 CompanySecrets 视图 (请参阅图 7) 。 默认情况下,在关闭浏览器窗口之前,将继续登录。

图 7 - CompanySecrets 视图

clip_image014

按用户名或用户角色授权

可以使用 [Authorize] 属性将控制器操作的访问限制为一组特定的用户或一组特定的用户角色。 例如,清单 2 中修改的主控制器包含两个名为 StephenSecrets () 和 AdministratorSecrets () 的新操作。

列表 2 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        Return View()
    End Function

    <Authorize()> _
    Function CompanySecrets()
        Return View()
    End Function


    <Authorize(Users:="Stephen")> _
    Function StephenSecrets()
        Return View()
    End Function

    <Authorize(Roles:="Administrators")> _
    Function AdministratorSecrets()
        Return View()
    End Function

End Class

只有名为 Stephen 的用户才能调用 StephenSecrets () 操作。 所有其他用户将重定向到登录视图。 Users 属性接受以逗号分隔的用户帐户名称列表。

只有具有管理员角色的用户才能调用 AdministratorSecrets () 操作。 例如,由于 Sally 是 Administrators 组的成员,因此她可以调用 AdministratorSecrets () 操作。 所有其他用户将重定向到登录视图。 Roles 属性接受以逗号分隔的角色名称列表。

配置身份验证

此时,你可能想知道用户帐户和角色信息的存储位置。 默认情况下,信息存储在 (RANU) 名为 ASPNETDB.mdf 的 SQL Express 数据库中,该数据库位于 MVC 应用程序的 App_Data 文件夹中。 此数据库由 ASP.NET 框架在开始使用成员身份时自动生成。

若要在解决方案资源管理器窗口中查看 ASPNETDB.mdf 数据库,首先需要选择菜单选项“项目”“显示所有文件”。

开发应用程序时,可以使用默认的 SQL Express 数据库。 但是,你很可能不希望对生产应用程序使用默认的 ASPNETDB.mdf 数据库。 在这种情况下,可以通过完成以下两个步骤来更改用户帐户信息的存储位置:

  1. 将 Application Services 数据库对象添加到生产数据库 - 将应用程序连接字符串更改为指向生产数据库

第一步是将所有必要的数据库对象 (表和存储过程) 添加到生产数据库。 将这些对象添加到新数据库的最简单方法是利用 ASP.NET SQL Server安装向导 (见图 8) 。 可以通过从 Microsoft Visual Studio 2008 程序组打开 Visual Studio 2008 命令提示符,并从命令提示符处执行以下命令来启动此工具:

aspnet_regsql

图 8 - ASP.NET SQL Server安装向导

clip_image016

使用 ASP.NET SQL Server安装向导,可以选择网络上SQL Server数据库,并安装 ASP.NET 应用程序服务所需的所有数据库对象。 数据库服务器不需要位于本地计算机上。

注意

如果不想使用 ASP.NET SQL Server安装向导,可以在以下文件夹中找到用于添加应用程序服务数据库对象的 SQL 脚本:

C:\Windows\Microsoft.NET\Framework\v2.0.50727

创建必要的数据库对象后,需要修改 MVC 应用程序使用的数据库连接。 修改 Web 配置 (web.config) 文件中的 ApplicationServices 连接字符串,使其指向生产数据库。 例如,清单 3 中修改的连接指向名为 MyProductionDB 的数据库, (原始 ApplicationServices 连接字符串已被注释掉) 。

清单 3 - Web.config

<connectionStrings>

<!--<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>-->

<add name="ApplicationServices" connectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=MyProductionDB" />

</connectionStrings>

配置数据库权限

如果使用集成安全性连接到数据库,则需要将正确的 Windows 用户帐户作为登录名添加到数据库。 正确的帐户取决于你是使用 ASP.NET Development Server 还是 Internet Information Services 作为 Web 服务器。 正确的用户帐户还取决于你的操作系统。

如果使用 ASP.NET Development Server (Visual Studio) 使用的默认 Web 服务器,则应用程序在 Windows 用户帐户的上下文中执行。 在这种情况下,需要将 Windows 用户帐户添加为数据库服务器登录名。

或者,如果使用 Internet Information Services,则需要添加 ASPNET 帐户或 NT AUTHORITY/NETWORK SERVICE 帐户作为数据库服务器登录名。 如果使用 Windows XP,请将 ASPNET 帐户作为登录名添加到数据库。 如果使用较新的操作系统(如 Windows Vista 或 Windows Server 2008),则添加 NT AUTHORITY/NETWORK SERVICE 帐户作为数据库登录名。

可以使用 Microsoft 向数据库添加新用户帐户SQL Server Management Studio (请参阅图 9) 。

图 9 - 创建新的 Microsoft SQL Server登录名

clip_image018

创建所需的登录名后,需要将登录名映射到具有正确数据库角色的数据库用户。 双击登录名并选择“用户映射”选项卡。选择一个或多个应用程序服务数据库角色。 例如,若要对用户进行身份验证,需要启用 aspnet_Membership_BasicAccess 数据库角色。 若要创建新用户,需要启用 aspnet_Membership_FullAccess 数据库角色 (见图 10) 。

图 10 - 添加应用程序服务数据库角色

clip_image020

总结

本教程介绍了在生成 ASP.NET MVC 应用程序时如何使用 Forms 身份验证。 首先,你了解了如何利用网站管理工具创建新用户和角色。 接下来,你学习了如何使用 [Authorize] 属性来防止未经授权的用户调用控制器操作。 最后,你了解了如何将 MVC 应用程序配置为将用户和角色信息存储在生产数据库中。