在 ASP.NET Core 2.0 中使用 Azure Active Directory 和 OpenID Connect 进行身份验证和授权





5.00/5 (9投票s)
本文主要介绍如何设置和配置 Azure AD 租户,以及如何将 Azure AD 集成到 ASP.NET Core 2.0 Web 应用程序中,以实现身份验证和基于角色的授权。
引言
使用 Visual Studio 向导将 Azure AD 集成到 ASP.NET Core 中非常简单。本文将介绍使用 Azure AD 进行身份管理以及 ASP.NET Core Web 应用程序中的相关配置。我们将探讨在幕后如何将 Azure AD 集成到 ASP.NET Core Web 应用程序中以实现身份验证和授权。
涵盖主题
1. 设置 Azure Active Directory 租户
- 创建新的 Azure AD 租户
- 在 Azure AD 租户中添加新用户
- 在 Azure AD 租户中添加新组
- 注册新应用程序
2. 将 Azure AD 集成到 ASP.NET Core 2.0 Web 应用程序中
- 选择模板
- Appsettings 中的更改
- 为 Azure AD 身份验证添加的扩展文件
- 添加的 NuGet 包
- 在启动时设置 Azure AD 身份验证
- 对控制器或操作应用授权属性
3. 使用 OpenID Connect 和 Azure AD 组在 ASP.NET Core 2.0 中进行基于角色的授权
- 使用 Azure AD 租户更新应用程序清单文件
- 从 Azure AD 获取组对象 ID 并更新 appsettings 文件
- 在启动时设置 Azure AD 授权
- 对控制器或操作应用策略
- 测试基于角色的授权声明
必备组件
- 本文中的示例是使用 Visual Studio 2017 update 15.7.4 实现的。
- 如果您需要全新安装,请完成您的 下载 并按照 分步安装指南 进行操作。
- 您需要 Azure 订阅。没有吗?您可以使用 免费试用,网址为 https://azure.microsoft.com/en-us/free/。
让我们深入了解基本概念
身份验证:它验证身份(验证您是谁)。
授权:它是一种安全机制,用于定义执行某项操作的访问权限(验证您可以访问什么)。
OpenID:它是一种身份验证机制,允许使用现有帐户(即 Google、Facebook 帐户)登录网站,而无需为每个网站创建特定的用户名和密码。
OpenID Connect:它用于在 OAuth(提供授权)之上进行身份验证。
Azure Active Directory:它是云中用于应用程序的身份管理服务。
Azure Active Directory 租户:它是 Azure 目录中组织的专用实例。它包含用户、组、注册的应用程序以及其他信息及其安全性。如果您没有 Azure Active Directory 租户,那么在注册和配置应用程序之前需要创建一个。最后,它将允许用户使用 Azure AD 登录和进行身份验证。
1. 设置 Azure Active Directory 租户
- 创建新的 Azure AD 租户
- 在 Azure AD 租户中添加新用户
- 在 Azure AD 租户中添加新组
- 注册新应用程序
创建新的 Azure AD 租户
打开 Azure 门户帐户,单击左侧窗格中的“+ 创建资源”图标,然后筛选 Azure Active Directory。单击页面底部的“创建”按钮。
在创建目录页面中,输入组织名称和初始域名。初始域名(例如 softdreams;全名:softdreams.onmicrosoft.com)是 Azure Active Directory 租户名称。对于国家或地区,请选择相应的国家。最后,单击“创建”按钮。
在 Azure AD 租户中添加新用户
在注册应用程序之前,您需要一个用户。要添加用户,请选择 Azure Active Directory > 用户 > 所有用户 > + 新用户。
在用户页面中,填写姓名、用户名和目录角色,然后为密码字段创建一个临时密码。您首次登录时需要此临时密码,然后需要更改它。最后,单击“创建”按钮。
在 Azure AD 租户中添加新组
如果您的应用程序需要基于角色的身份验证,则创建组并将用户添加到这些组中。要创建组,请选择 Azure Active Directory > 组 > 所有组 > + 新建组。填写组类型、组名称、组描述和成员类型。最后,单击页面底部的“创建”按钮。
要将成员添加到组中,请选择 Azure Active Directory > 组 > 所有组。现在找到并选择该组,然后选择成员 > + 添加成员。
注意:您可以通过在服务器上 安装和配置 Azure AD Connect,将现有用户和组从本地 Windows Server AD 同步到 Azure AD 租户。
注册新应用程序
在 .NET Core 项目示例中,我没有手动注册应用程序。如果您想手动注册新应用程序,请选择 Azure Active Directory > 应用注册 > + 新建应用程序注册。现在,填写所需字段,然后单击创建页面底部的“创建”按钮。
2. 将 Azure AD 集成到 ASP.NET Core 2.0 Web 应用程序中
- 选择模板
- Appsettings 中的更改
- 为 Azure AD 身份验证添加的扩展文件
- 添加的 NuGet 包
- 在启动时设置 Azure AD 身份验证
- 对控制器或操作应用授权属性
在 Azure AD 中,我们可以手动注册应用程序;但 Visual Studio 2017 支持一个简单的向导来注册新应用程序并添加 Azure AD 身份验证。
选择模板
打开 Visual Studio 以创建新项目。选择 ASP.NET Core Web 应用程序 > 选择 Web 应用程序(模型-视图-控制器)模板 > 单击“更改身份验证”按钮 > 选择“工作或学校帐户”。
选择云 - 单一组织。填写域名字段,即 Azure Active Directory 租户名称(例如 softdreams.onmicrosoft.com)。
将客户端 ID 留空。如果您在 Azure AD 租户中手动注册应用程序,您将获得应用程序 ID,它就是这里的客户端 ID。单击确定按钮创建项目。现在它已准备好验证 OpenID Connect 身份验证。
检查幕后发生的事情,我们需要逐步了解项目中发生的一些变化。
Appsettings 中的更改
- 域:这是 Azure Active Directory 租户名称(例如 softdreams.onmicrosoft.com)。
- 租户 ID:这是 Azure Active Directory ID。要验证目录 ID,请选择 Azure Active Directory > 属性 > 目录 ID。
- 客户端 ID:这是 Web 应用程序的应用程序 ID,由 Visual Studio 向导自动注册。要验证应用程序 ID,请选择 Azure Active Directory > 应用注册 > 找到并选择您的应用程序(例如“`HR.AzureAuthentication.HelloWorld`”)> 应用程序 ID。
- 回调路径:这是身份验证后的重定向路径(例如,https://:44387/signin-oidc)。
如果您打开此项目并选择解决方案资源管理器 > 项目属性 > 调试,您将找到启用 SSL 的 URL,即 https://:44387/。
现在,如果您想添加生产回调重定向路径(例如,https://helloworld.softdreams.com/signin-oidc),请选择 Azure Active Directory > 应用注册 > 找到并选择您的应用程序(例如 `HR.AzureAuthentication.HelloWorld`)> 设置 > 回复 URL,然后添加生产重定向路径并保存。
为 Azure AD 身份验证添加的扩展文件
`AzureAdAuthenticationBuilderExtensions` 和 `AzureAdOptions` 文件在 extensions 文件夹中创建。
添加的 NuGet 包
- `Microsoft.AspNetCore.Authentication.Cookies` 和
- `Microsoft.AspNetCore.Authentication.OpenIdConnect` 已添加用于身份验证
在启动时设置 Azure AD 身份验证
在启动文件中,添加了以下代码
对控制器或操作应用授权属性
在 *HomeController* 文件中,添加了 `[Authorize]` 属性。
3. 使用 OpenID Connect 和 Azure AD 组在 ASP.NET Core 2.0 中进行基于角色的授权
- 使用 Azure AD 租户更新应用程序清单文件
- 从 Azure AD 获取组对象 ID 并更新 appsettings 文件
- 在启动时设置 Azure AD 授权
- 对控制器或操作应用策略
- 测试基于角色的授权声明
您还记得下图中的选项吗?在此图中,如果我们要从 Azure AD 读取用户的 AD 信息,例如配置文件、角色、组等,我们需要选中“读取目录数据”。
使用 Azure AD 租户更新应用程序清单文件
如果要读取用户的组,则需要修改 Azure AD 中应用程序的清单。要更新清单,请选择 Azure Active Directory > 应用注册 > 找到并选择您的应用程序(例如 `HR.AzureAuthentication.HelloWorld`)> 单击顶部操作栏中的清单,并将 `“groupMembershipClaims”: null` 更改为 `“groupMembershipClaims”: “SecurityGroup”`。
如果您选择“`SecurityGroup`”,那么您将获得用户的所有组列表。如果您选择“`All`”,那么您将获得安全组和通讯组列表。无论如何,最后单击“保存”按钮。
从 Azure AD 获取组的对象 ID 并更新 Appsettings 文件
如果要实现基于角色的授权,则需要从 Azure AD 获取该组的对象 ID,以便将其添加到 *appsettings* 文件中。如果将所有配置值添加到 *appsettings* 文件中,则修改这些值会很容易。要获取组的对象 ID,请选择 Azure Active Directory > 组 > 搜索所需的组 > 属性。
现在从“常规设置”页面复制对象 ID 并将其粘贴到项目的 *appsettings.json* 文件中。
在启动时设置 Azure AD 授权
您需要将以下代码添加到 *Startup* 文件的 `ConfigureServices` 方法中。在此项目中,例如,我们有两种类型的角色(管理员和用户)。这就是我们添加 `Admins` 和 `Users` 组的原因。
services.AddAuthorization(options =>
{
options.AddPolicy("Admins",
policyBuilder => policyBuilder.RequireClaim("groups",
Configuration.GetValue<string>("AzureSecurityGroup:AdminObjectId")));
});
services.AddAuthorization(options =>
{
options.AddPolicy("Users",
policyBuilder => policyBuilder.RequireClaim("groups",
Configuration.GetValue<string>("AzureSecurityGroup:UserObjectId")));
});
对控制器或操作应用策略
根据您的要求,在控制器或操作的顶部添加 `[Authorize(Policy = "Users")]` 或 `[Authorize(Policy = "Admins")]` 属性。
测试基于角色的授权声明
您可以检查成功登录后从 Azure AD 返回的组列表。使用以下代码来实现。
var groups = User.Claims.Where(c => c.Type == "groups").ToList();
注意:在运行附加的项目之前,请选择 *appsettings.json* 文件并根据您的 Azure AD 租户、注册的应用程序和组的值更改 "`Domain`"、"`TenantId`"、"`ClientId`"、"`AdminObjectId`"、"`UserObjectId`"。