65.9K
CodeProject 正在变化。 阅读更多。
Home

嵌入式应用程序身份标识第一部分:ASP.NET MVC 5 中的基本身份标识管理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (9投票s)

2014 年 5 月 8 日

CPOL

12分钟阅读

viewsIcon

53957

使用嵌入在 ASP.NET MVC 应用程序中的 ASP.NET Identity 数据库进行身份标识管理

在本文中,我们将深入探讨 ASP.NET Identity 及其在为使用 ASP.NET MVC 的企业应用程序提供基本 身份标识管理 (IdM) 方面所起的作用。ASP.NET Identity 是 Visual Studio 2013 和 ASP.NET MVC 5 随附的默认身份标识管理 API。虽然 ASP.NET Identity 可能不会在生产环境的内网中使用,但本文的目标是提供对企业应用程序的基线 IdM 要求的理解。

下图概述了应用程序、其用户和其模块在最简单、最早形式下的关系。早期的基于 Web 的应用程序由用户和模块组成。此时,所有用户都可以访问应用程序中的所有模块。

Users_No_Access_Points

我假设您对使用 Visual Studio 和 SQL Server 创建基于 Web 的 ASP.NET 应用程序有基本了解。我们将参考一些 ASP.NET 代码来帮助说明 IdM 概念。然而,本文及后续文章中涵盖的许多内容被认为是 DevOps 领域的内容——即软件开发与 IT 之间的集成,特别是 IdM 的运营和基础设施方面。

我建议手边准备好 ASP.NET 源代码以供参考。您可以通过以下两种方式之一完成此操作:

  • 下载以下 github 存储库中 ASP.NET MVC 示例项目的源代码:https://github.com/pcarrasco23/FootlooseFinancialServices

  • 使用 Visual Studio 2013 和 MVC 5 模板创建一个新的 ASP.NET MVC 项目。教程 ASP.NET MVC 5 入门 将向您展示如何做到这一点。在学习教程时,请确保身份验证方法是“Individual User Accounts”(单独用户账户)。

在后续文章中,我将把我们的企业应用程序示例与更有可能在生产环境中使用的外部 IdM 服务集成。

  • Windows Active Directory

  • 适用于 Linux 的 386 目录服务器

  • 使用 PingFederate 进行单点登录

要求

现在,我们将列出我们业务线应用程序中的身份标识管理要求。该应用程序将由公司员工使用,特别是财务顾问。

  • 用户必须登录应用程序才能访问其任何功能,除了登录页面本身之外。

  • 用户账户必须由另一位具有管理员权限的用户创建。

  • 将有 4 种角色:管理员、人口统计信息编辑者、财务经理、在线访问经理。

  • 所有角色至少可以查看账户持有人的数据。

  • 人口统计信息编辑者角色的用户可以修改账户持有人的个人(地址、电话、电子邮件地址)数据。

  • 财务经理角色的用户可以修改账户信息。

  • 在线访问经理角色的用户可以修改账户持有人的在线访问权限。

  • 所有应用程序角色都是预定义的。不存在管理员创建角色的情况。

  • 每个用户可以属于零个或多个角色。

  • 将有一个自助服务功能,允许用户更改其系统密码。

应用程序

本文将使用的 ASP.NET MVC 示例演示应用程序是 fictitious company Footloose Financial Services 的财务账户经理用于管理其客户的管理应用程序。它使用默认的 ASP.NET MVC 模板创建,并带有 Footloose 市场部门定制的用户界面。以下是该应用程序的一些功能。

身份标识 – 创建(注册)新用户

系统允许创建或注册新用户,以便用户可以访问系统。通常,此功能将由具有管理员权限的用户执行,但在默认的 ASP.NET MVC 模板中,此功能不限于管理员用户(我们将在下一篇文章中讨论如何将此功能限制为管理员用户)。

Register

身份验证 – 登录系统

用户注册后,她可以使用登录屏幕登录系统。系统中的所有屏幕和 Web 服务都需要身份验证。如果用户通过身份验证,她将被带到最初请求的网页。>

后续页面请求不需要再次输入凭据,因为身份验证浏览器 cookie 存储在用户的 Web 浏览器中,ASP.NET Identity 使用它来识别请求来自何处。cookie 在用户浏览器中保持活动状态,直到过期,届时用户需要再次登录才能继续使用该应用程序。

Login

自助服务 – 管理您的账户

系统将允许用户更改其密码。

Manage

用户登录系统后,她可以管理她的客户。

Search

作为一个公司内部而非面向公众的应用程序,通过单独用户账户进行身份验证并非理想选择,使用 Active Directory 等外部服务会更有效率,该服务可以由单独的安全部门管理。然而,为了理解 IdM 的各个技术组件,了解 Microsoft 为单独用户账户提供的服务是有益的。

设置和配置 Visual Studio 项目

如果您下载了同一项目的源代码,您需要执行一些操作才能使其正常运行。

1. 下载并安装 SQL Server 2012 Express

Footloose Financial 应用程序使用 SQL Server 作为数据库引擎。您可以选择使用现有的 SQL Server 2012 实例,或免费下载并安装 SQL Server 2012 Express。

2. 将 FoolooseFS.mdf 文件附加到您的 SQL Server 实例

标记为“Added FootlooseFS MDF file for SQL server”的 github 提交在 App_Data 文件夹中包含应用程序的 SQL Server 数据 (MDF) 文件。在 SQL Server 实例中创建一个名为“FootlooseFS”的新数据库,并将 MDF 文件附加到该数据库,以便您拥有数据库架构和账户持有人的示例数据。在 web.config 文件中,有一个名为“FootlooseFSContext”的数据库连接字符串,其中包含应用程序期望的数据库连接参数。MDF 文件已包含数据库用户“FootlooseFSdbuser”和示例数据,但您需要更改数据源以匹配您的 SQL Server 实例的名称。

3. 创建一个名为“admin”的 ASP.NET Identity 用户。

构建并运行应用程序后,您还需要注册一个名为“admin”的应用程序用户,密码由您选择。您需要以应用程序用户的身份登录才能访问应用程序中的任何功能。此外,下一篇关于角色的文章将需要一个“admin”用户。

ASP.NET Identity

ASP.NET Identity 是内置于 ASP.NET 的身份和身份验证管理系统。它为企业 Web 应用程序提供以下 IdM 服务来管理其用户群:

  • 将用户添加到系统、更新和删除用户

  • 将角色添加到系统、更新和删除角色

  • 将用户添加到角色或从角色中删除用户。

  • 登录和注销用户

  • 扩展用户属性

  • 将其系统账户链接到外部服务,如 Facebook 或 Twitter

身份标识 是在系统中创建账户的过程,这些账户代表将使用系统的物理用户或进程。ASP.NET Identity 支持通过数据库接口和用于通过其 API 管理用户的功能来进行身份标识。

身份验证 是用户验证其身份以访问系统的过程。ASP.NET Identity 通过提供额外的 API 来验证用户及其密码来支持身份验证。ASP.NET Identity 提供了其他一些本文未涵盖的功能,包括外部社交媒体账户访问、声明接口和 OWIN 集成。

以下 Microsoft 文章提供了有关 ASP.NET Identity 的更多信息:http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

ASP.NET Identity 配置和 API

让我们看一下 ASP.NET Identity 在示例解决方案中的配置和使用方式。

与 ASP.NET Identity 数据存储的数据库连接

FootlooseFS.Web.AdminUI 项目是使用 MVC 5 模板开发的,所以我们从 web.config 文件开始。“DefaultConnection”数据库连接字符串是 ASP.NET Identity 用户和角色数据库的连接字符串。默认情况下,ASP.NET Identity 数据库是嵌入到应用程序中的 SQL Server LocalDb 实例。

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20140224105332.mdf;Initial Catalog=aspnet-WebApplication1-20140224105332;Integrated Security=True"
 providerName="System.Data.SqlClient" />

开发人员可以修改此设置以指向单独 SQL Server 实例上的 ASP.NET Identity 数据库,但数据库架构必须保持不变。现在我们来看一下数据库架构。在 VS 解决方案中,单击“Server Explorer”(服务器资源管理器)选项卡,然后打开“Data Connections”(数据连接)、“DefaultConnection”和“Tables”(表)。这些表存储 ASP.NET Identity 用于执行其任务的数据。AspNetUsers 表存储可以访问系统的用户。

ASPNETIdentityDatabase

ASP.NET Identity API

现在让我们看看如何使用 ASP.NET Identity API 来创建用户并允许他们登录系统。回到 Solution Explorer(解决方案资源管理器)选项卡,在 FootlooseFS.Web.AdminUI 项目中,打开 Controllers(控制器)文件夹并查看 AccountController.cs 文件。这是使用 ASP.NET Identity API 来实现身份标识、身份验证和自助服务的代码文件。UserManager 类公开了与用户相关的 API,用于在 ASP.NET Identity 数据存储中创建和更新用户。以下是应用程序使用的几个关键方法。

  • FindAsync – 在数据存储中查找与给定用户名和密码匹配的用户。

  • CreateAsync – 使用给定的用户信息和密码在数据存储中创建用户。

  • ChangePasswordAsync – 更改由给定用户 ID 指定的数据存储中用户的密码。

  • CreateIdentity – 从用户和身份验证类型创建声明,用于登录系统。

我们关心的 API 中的另一个类是 AuthenticationManager 类。该类在客户端身份验证过程中管理身份验证模块。以下是应用程序使用的关键方法。

  • SignIn – 通过给定的机制(通常是浏览器 cookie)将给定用户登录到系统并持久化身份验证。这样,如果我想访问系统中的另一个网页,就不需要再次输入我的凭据,因为身份验证浏览器 cookie 证明我已通过身份验证。

  • SignOut – 将用户注销出系统并终止持久化的身份验证,通常通过删除身份验证浏览器 cookie 来实现。因为 cookie 已被删除,下次访问系统中的任何网页时,我都需要重新登录。

UserManager 和 AuthenticationManager 类提供了创建用户并将用户登录到系统的功能。当网站使用 MVC 5 单独用户账户身份验证作为模板时,此功能默认提供,无需额外编码。然而,了解这些类的作用很重要,以防您想更改默认功能(例如,在下一篇文章中我们将介绍角色,并将用户注册功能移到一个单独的页面,仅供管理员用户访问)。

ASP.NET MVC 和 IdM

让我们看一下 ASP.NET MVC 为在企业 Web 应用程序中实现 IdM 而提供的其他开箱即用功能。

我想配置所有 Web 服务以要求身份验证。

ASP.NET MVC 提供了过滤器(filter)的概念,它本质上是一个应用于所有 Web 服务(在 MVC 世界中称为控制器)的规则。在 App_Start/FilterConfig.cs 文件中,全局过滤器被注册,这意味着它们将应用于所有控制器。AuthorizeAttribute 指示所有 Web 服务功能,包括所有网页,都需要身份验证。

public class FilterConfig
 {
     public static void RegisterGlobalFilters(GlobalFilterCollection filters)
     {
         filters.Add(new HandleErrorAttribute());
         filters.Add(new AuthorizeAttribute());
     }
 }

如果系统中的所有网页都需要身份验证才能访问,我如何才能访问登录页面?

好问题。如果您仔细查看 AccountsController.cs 文件,您会注意到大多数方法上面都有 [AllowAnonmous] 属性。这告诉 MVC 这些控制器不需要身份验证。这允许未经身份验证的匿名用户访问这些功能。

在哪里指定确切的登录页面和要使用的身份验证持久化机制?

在 App_Start/Startup.Auth.css 中,指定了登录页面(或路径)和身份验证持久化方法。默认情况下,在 MVC 5 模板中,登录页面是 /Account/Login,持久化方法是浏览器 cookie。这些设置可以自定义,以使用不同的网页进行身份验证,或使用外部 cookie,例如用于身份验证持久化的 Facebook cookie。

我希望 ASP.NET Identity 创建的身份验证 cookie 在 8 小时后过期。

默认情况下,ASP.NET 身份验证 cookie 不会过期(至少在合理的时间内不会)。通常,我们不希望此 cookie 的有效期超过一天,如果我们从未手动点击“注销”链接(谁会在完成应用程序后 bother 点击“注销”链接?)。所以,让我们将 cookie 的过期时间更改为 8 小时。在 StartupAuth.cs 文件中,我们可以更改 CookieAuthenticationOptions 类的 ExpireTimeSpan 属性,以便 cookie 在 8 小时后过期。

// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
    AuthenticationType =     
    DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = new System.TimeSpan(8, 0, 0)
 });

登录系统后,无论活动或非活动,您都将在 8 小时后被提示再次登录。如果您希望 cookie 在 8 小时非活动或空闲时间后过期,那么您需要向 ASP.NET Identity 表明您想要一个滑动过期。这意味着只要 ASP.NET Identity 访问 cookie,它将保持活动状态。将 SlidingExpiration 属性设置为 true。

// Enable the application to use a cookie to store information for the signed in user
 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
    AuthenticationType =   
    DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = new System.TimeSpan(8, 0, 0),
    SlidingExpiration = true
 });

请参阅以下文章,更深入地了解 ASP.NET 表单身份验证 cookie 的工作原理。它涵盖了身份验证 cookie 中存储的信息、用于存储信息的加密方法以及您如何在 machine.config 文件中设置服务器上的默认属性。了解表单身份验证票证和 cookie

我想将用户注册功能移动到一个只能由管理员用户访问的管理员页面。

将应用程序中的管理员功能(例如在系统中创建用户账户)与标准业务功能分开是一个好主意。然而,在此之前,我们需要建立一个创建角色并将用户分配给角色的流程。我们将在下一篇文章中介绍。

© . All rights reserved.