使用 Web API AuthorizeAttribute 角色的 Azure AD OAuth 客户端凭据授予流程

2024-05-14

Given

  • 我们有 .NET Web API 服务。
  • 它使用以下方式保护对控制器和操作的访问授权属性 https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.authorizeattribute with Roles。例如:
[Authorize(Roles = "Reader,Requester,Editor,Approver,Administrator")]
  • 有一个应用程序注册在此应用程序的 Azure Active Directory 中。
  • 它使用 OAuth 进行用户模拟,并且用户身份验证正确。有许多教程可以帮助您实现这一点。

Intent

  • 我们希望有一个无人值守的计划进程(脚本)在 Web API 上调用 REST 调用。
  • The identity of the unattended process is not available in Azure Active Directory.

    在我的特定场景中,这是因为我们没有将众多本地 AD 服务帐户同步到 AAD,并且该脚本将从本地服务主体身份运行。

  • 我们希望使用AuthorizeAttribute控制我们的脚本对 Web API 中的控制器/操作的访问。

我怎样才能做到这一点?


Method

限制之一是无人参与进程的用户身份不会存在于 Azure Active Directory 中;所以我们将使用OAuth 2.0 客户端凭据授予流程 https://oauth.net/2/grant-types/client-credentials/对于这种情况。

第 1 步:收集信息

首先,确定以下信息:

  1. 客户ID
  2. 租户ID
  3. 权威网址
  4. 资源网址
  5. 客户秘密

如果您已经让 OAuth 适用于用户和角色,那么您可能已经拥有其中的大部分。如果没有,这里是它们是什么以及在哪里可以找到它们。

1a:查找客户端 ID

客户端 ID 是 GUID,也是 Azure Active Directory 中应用程序的 ID。它不是对象 ID(这是不同的)。

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >Overview刀片 >应用程序(客户端)ID field.

电源外壳,来自登录上下文:

$(Get-AzADApplication -DisplayName "[your app name]").ApplicationId.Guid

1b:查找租户 ID

Azure 租户 ID 是 GUID。

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >Overview刀片 >目录(租户)ID field.

电源外壳,来自登录上下文:

$(Get-AzContext).Tenant.Id

Azure CLI,来自登录上下文:

az account show --query 'tenantId' -o tsv

1c:查找权威 URL

Authority Url 是 OAuth 授权服务器的 URL。它看起来像这样:https://login.microsoftonline.com/[your-tenant-id]/oauth2/v2.0/token

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >端点按钮 >OAuth 2.0 令牌端点 (v2) field.

1d:查找资源 URL

资源 URL 是 Web API 服务的 URL。它可能看起来像这样:https://[yourdomain].onmicrosoft.com/[guid]

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >公开 API刀片 >应用程序 ID URI field.

它也位于应用程序清单中identifierUris field. Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >Manifest.

清单属性示例:

"identifierUris": [
    "https://[yourdomain].onmicrosoft.com/[guid]"
]

电源外壳,来自登录上下文:

$(Get-AzADApplication -ApplicationId [ClientId]).IdentifierUris

Azure CLI,来自登录上下文:

az ad app show --id [ClientId] --query 'identifierUris' -o tsv

1e:创建客户端密钥

客户端机密可以是客户端机密(密钥/密码)或证书。以下是如何创建客户端密钥。

Azure 门户:

  1. Go to Azure 活动目录 > 应用程序注册> [您的应用程序] >证书和秘密刀片 >客户秘密部分。
  2. 新客户秘密按钮并完成此过程。
  3. 复制键值;这是客户秘密。不要丢失它。

电源外壳: 使用New-AzADAppCredential https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azadappcredential cmdlet.

步骤 2:配置 Azure Active Directory 应用程序

既然你正在使用AuthorizeAttribute要控制访问的角色,您必须将应用程序添加到至少其中一个角色。角色定义在应用清单在下面appRoles属性。

2a:创建应用程序可以所属的角色

每个角色都有一个allowedMemberTypes属性。如果您已经为用户配置了此应用程序,那么您已经拥有如下内容:

"allowedMemberTypes": [
    "User"
],

要允许将您的应用程序添加到角色,请按如下方式修改它:

"allowedMemberTypes": [
    "User",
    "Application"
],

或者,您可以拥有一个允许only应用程序。

"allowedMemberTypes": [
    "Application"
],

2b:将应用程序添加到其角色

现在应用程序可以属于一些角色,您必须将应用程序添加到这些角色中。

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >API权限 blade.

  1. 添加权限 button.
  2. 选择我的组织使用的 API tab.
  3. 查找并选择您的应用程序。
  4. 应用程序权限 box.
  5. 选择该应用程序的权限(角色)。
  6. 最后,按添加权限 button.

2c:授予管理员同意

如果这些角色需要管理员同意,那么您现在需要授予管理员同意。

Azure 门户: Azure 活动目录 > 应用程序注册> [您的应用程序] >API权限刀片 >授予同意部分。按授予 [您的组织] 管理员同意按钮,然后确认Yes.

如果您没有权限执行此操作,请在应用程序管理员角色或具有类似权限的其他人可以为您执行此操作。

第 3 步:验证

此时,您应该能够使用 OAuth 2.0 客户端凭据流程来获取访问令牌,将其作为承载令牌与您对 Web API 服务的请求一起呈现,然后成功。

如果您想使用 Postman 或类似工具进行验证,请使用本指南 https://learn.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow创建请求。

当您拿到令牌后,您可以使用此工具检查其内容:https://jwt.io/ https://jwt.io/验证是否有一个roles令牌中的属性,并且它使用您在上一步中分配的角色填充。

例如:

{
    …
  "azpacr": "1",
  "roles": [
    "Approver",
    "Reader"
  ],
  "ver": "2.0"
    …
}

这里有一个电源外壳脚本展示了如何使用ADAL.PS https://www.powershellgallery.com/packages/ADAL.PS/ module:

Import-Module ADAL.PS
$tenantId = "[tenant id]"
$authority = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize"
$resourceUrl = "[resource url]"
$clientId = "[client id]"
$secret = ConvertTo-SecureString -String [client secret] -AsPlainText -Force
$response = Get-ADALToken -Authority $authority -Resource $resourceUrl -ClientId $clientId -ClientSecret $secret
$token = $response.AccessToken
$response
$restResponse = Invoke-RestMethod -Method Get -Uri "[your web api uri]" -ContentType "application/json; charset=utf-8" -Headers @{ Authorization = "Bearer $token" } -Verbose -Debug
$restResponse

第 4 步:保护您的秘密

现在,您已经在无人值守的脚本或工作中掌握了这个秘密。这可能不是一个好主意,所以要以某种方式确保安全。您如何做到这一点超出了本答案的范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Web API AuthorizeAttribute 角色的 Azure AD OAuth 客户端凭据授予流程 的相关文章

随机推荐