Method
限制之一是无人参与进程的用户身份不会存在于 Azure Active Directory 中;所以我们将使用OAuth 2.0 客户端凭据授予流程 https://oauth.net/2/grant-types/client-credentials/对于这种情况。
第 1 步:收集信息
首先,确定以下信息:
- 客户ID
- 租户ID
- 权威网址
- 资源网址
- 客户秘密
如果您已经让 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 门户:
- Go to Azure 活动目录 > 应用程序注册> [您的应用程序] >证书和秘密刀片 >客户秘密部分。
- 按新客户秘密按钮并完成此过程。
- 复制键值;这是客户秘密。不要丢失它。
电源外壳: 使用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.
- 按添加权限 button.
- 选择我的组织使用的 API tab.
- 查找并选择您的应用程序。
- 按应用程序权限 box.
- 选择该应用程序的权限(角色)。
- 最后,按添加权限 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 步:保护您的秘密
现在,您已经在无人值守的脚本或工作中掌握了这个秘密。这可能不是一个好主意,所以要以某种方式确保安全。您如何做到这一点超出了本答案的范围。