当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Azure Functions 和 Azure AD 身份验证

作者:精品下载站 日期:2024-12-14 07:14:00 浏览:13 分类:玩电脑

Azure Functions 和 Azure AD 身份验证


这篇文章是有关 Azure Functions 和 PowerShell 的系列文章的一部分。查看该系列中其他帖子的列表!

Azure Functions 和 Azure AD 身份验证

Azure Functions 简单、便宜且可扩展。

PowerShell 是一种功能强大的语言,非常适合自动化和编写将系统“粘合”在一起的集成。

这对我来说是天作之合,但我如何知道并验证谁调用了我的代码?这就是身份验证发挥作用的地方。身份验证就是验证谁连接到我的应用程序,以便我(或我的代码)可以确定他们是否应该被授权这样做。

要求 Azure AD 用户登录 Azure Functions

让我们从简单开始吧。我希望用户在调用我的函数时使用 AzureAD 进行身份验证。

这个场景实际上非常简单,因为它是 Azure Functions 中包含的一项功能,或者公平地说,它包含在构建 Functions 的 Azure 应用服务中。此功能可以在两种管理模式(快速或高级)中的一种中启用。因为我喜欢真正了解事物是如何运作的,所以我将涵盖它们。

我们为此使用的功能曾经称为 easyauth。搜索 Azure 应用服务和 easyauth 或“easy auth”可能会为您提供一些有价值的信息。

选择快速模式和高级模式进行身份验证

与大多数其他情况一样,做事有一种简单的方法,也有一种不太简单的方法。在这种情况下,最简单的方法称为“快速”模式。引用鼠标悬停的解释:

“快速模式将使用您的默认 AAD,并可以为您创建 AAD 应用程序。如果您想要自定义 AAD 配置,请选择高级模式”

快速模式可以在几秒钟内完成设置,并且适用于大多数简单的场景,但您只能设置一次,而且我经常会遇到这样的情况:我想稍后更改内容,这在使用快速模式时有点困难。

您还需要注意快速模式的另一个缺点。截至 2020 年 10 月撰写本文时,快速模式设置了 Azure AD V1 应用程序。如果我们想使用较新的 V2 端点,我们需要使用高级模式。 Microsoft 建议对新项目使用 V2 终结点。查看为什么更新到 Microsoft Identity Platform (v2.0) 以了解更多信息。

Active Directory 身份验证快速模式

在这种情况下,我假设我们有一个正在运行的 Function App,并且允许执行这些步骤的用户在 Azure Active Directory 中注册应用程序。

首先转到“身份验证/授权”边栏选项卡。

正如警告文本告诉我们的,我们需要按顺序进行 SSL 配置,使用 .NET 版本 4.5 或更高版本,并将管理管道模式设置为“集成”。由于这是新功能应用程序的默认设置,因此我不会在这里详细介绍。

打开应用服务身份验证,将下拉列表“请求未经身份验证时采取的操作”设置为“使用 Azure Active Directory 登录”。这会将任何未经身份验证的请求重定向到登录提示。

在“身份验证提供程序”下,单击“Azure Active Directory”。

[玩转系统] Azure Functions 和 Azure AD 身份验证

进入 Azure Active Directory 设置后,将管理模式从“关闭”更改为“快速”,为新应用程序选择一个好名称(它需要在租户中是唯一的),其余部分保持原样,然后单击“确定”。

[玩转系统] Azure Functions 和 Azure AD 身份验证

返回身份验证/授权刀片后,不要忘记单击该保存按钮。

就这么简单!我们现在有一个需要 Azure AD 身份验证的功能!我们来尝试一下吧!

通过转到“函数”获取函数的 URL,选择一个函数(在我的例子中为“HttpTrigger1”),然后单击边栏选项卡顶部的“获取函数 Url”。

[玩转系统] Azure Functions 和 Azure AD 身份验证

在网络浏览器中输入完整的功能 Url,您将被重定向到登录提示。如果这是您第一次登录此应用程序,您将收到同意请求。

[玩转系统] Azure Functions 和 Azure AD 身份验证

如果您是租户中的应用程序管理员,您还会看到一个复选框,上面写着“代表您的组织同意”。只需单击“接受”即可仅接受当前用户。选中该框然后单击接受将为租户中的每个用户授予应用程序同意,即所谓的管理员同意。

为了根本不出现这个问题,我们可以在尝试登录之前授予管理员同意。这可以通过导航到 Azure Active Directory 和应用程序注册边栏选项卡在 Azure 门户中完成。选择“所有应用程序”选项卡,找到刚刚创建的应用程序,然后转到左侧菜单中的“API 权限”。在打开的新边栏选项卡中,我们可以看到应用程序需要将 User.Read 委托给 Graph API。要为组织中的所有用户批准此操作,只需单击“授予 的管理员同意”。

[玩转系统] Azure Functions 和 Azure AD 身份验证

就是这样!

Active Directory 身份验证高级模式

如果以下任一陈述为真,您可能需要使用授权的高级设置。

  • 我想使用新的 Microsoft 身份平台
  • 我想使用在另一个 Azure AD 租户中注册的应用程序
  • 我想要更好地控制和理解我所设置的内容
  • 我无权自行创建应用程序,需要请别人为我创建应用程序

要使用高级设置设置授权,我们首先需要为 API 创建应用程序注册。

由于我不喜欢点击门户,所以我喜欢使用某种脚本来完成此操作。这次我将使用 PowerShell 中的 Azure CLI。更新显示名称和标识符 uri 以适合您的场景并运行脚本。

这个脚本做了一些事情。首先,我为我的应用程序配置显示名称和功能应用程序的名称。

然后,我收集应用程序获取有关登录用户的信息所需的一些访问权限。我这样做是为了我可以同意我的脚本中的所有这些权限,并且永远不必看到该同意对话框。

获得所有这些信息后,我们使用 az ad app create 创建应用程序,并使用 az ad sp create 创建服务主体。

然后我们为所有用户授予电子邮件、openid 和个人资料权限,这是同意部分。

最后,我们将 requestedAccessTokenVersion 设置为值 2。这会将清单中的值 accessTokenAcceptedVersion 设置为 2,并告诉 Azure AD 我们需要 V2 终结点令牌。现在,Azure CLI 目前使用的是不支持此功能的 Azure AD Graph API,因此我使用 az rest 来调用 Microsoft Graph 来执行此步骤。

$ServerAppDisplayName = 'MySuperAPI'
$SystemName = 'mycoolfunction'

# Get tenant id of current tenant
# (make sure to be signed in with az cli)
$TenantId = az account show --query 'tenantId' -o tsv
# Server app identifier, needs to be unique
# I'll default to an azure websites url
# Update to something that fits you
$ServerAppIdentifierUri = "https://$SystemName.azurewebsites.net"

# ReplyUris, this is where AzureAD will send the token.
# Make sure to get this right!
$ReplyUri = "https://$SystemName.azurewebsites.net/.auth/login/aad/callback"



# Create configuration for delegated permissions to graph API
# Get application id of Microsoft Graph
$GraphAppId = az ad sp list --query '[?appDisplayName==''Microsoft Graph''].appId' -o tsv --all
# Get all permissions available to graph
$Permissions = az ad sp show --id $GraphAppId --query 'oauth2Permissions' | ConvertFrom-Json
# Select the permissions we need
$EmailPermission = $Permissions.Where{ $_.value -eq 'email' }.id
$ProfilePermission = $Permissions.Where{ $_.value -eq 'profile' }.id
$OpenIdPermission = $Permissions.Where{ $_.value -eq 'openid' }.id

# Build part of a manifest for requiredResourceAccess
$requiredResourceAccess = @(
    @{
        resourceAppId  = $GraphAppId
        resourceAccess = @(
            @{
                id   = $EmailPermission
                type = 'Scope'
            },
            @{
                id   = $ProfilePermission
                type = 'Scope'
            },
            @{
                id   = $OpenIdPermission
                type = 'Scope'
            }
        ) 
    }
) | ConvertTo-Json -AsArray -Depth 4 -Compress | ConvertTo-Json
# Pipe to ConvertTo-Json twice to escape all quotes, or az cli will remove them when parsing

# Register the application
$ServerApp = az ad app create --display-name $ServerAppDisplayName --identifier-uris $ServerAppIdentifierUri  --required-resource-accesses $requiredResourceAccess --reply-urls $ReplyUri | ConvertFrom-Json
# Create a service principal for the application
$null = az ad sp create --id $ServerApp.AppId

# Consent the application for all users
$null = az ad app permission grant --id $ServerApp.AppId --api $GraphAppId --scope "email openid profile"

# Set application to use V2 access tokens
$Body = @{
    api = @{
        requestedAccessTokenVersion = 2
    }
} | ConvertTo-Json -Compress | ConvertTo-Json
# Pipe to ConvertTo-Json twice to escape all quotes, or az cli will remove them when parsing
$null = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$($ServerApp.objectId)" --body $Body --headers "Content-Type=application/json"

# Output the ClientId for use later
Write-Output $ServerApp.AppId

就我而言,我得到的 AppId 为 c491d3f8-0d15-4ea5-96fd-957601d579fa。这也称为我的应用程序的 clientId。我们稍后会需要这个,所以一定要把它写下来。

让我们转到 Azure 门户中的函数应用程序。导航到“身份验证/授权”边栏选项卡,选择“开”,使用“使用 Azure Active Directory 登录”操作,然后单击“Azure Active Directory”,就像我们在“快速模式”中所做的那样。

这次我们将选择“高级”而不是“快速”。在这里,我们需要输入上面注册的 ClientId (AppId) 以及颁发者 URL。颁发者 Url 包含以下部分:“//v2.0”,其中全局 Azure 中的 Azure AD 身份验证终结点为 https://login.microsoftonline.com。对于其他云,请检查 Azure AD 身份验证终结点。您可以在门户中获取租户 ID,也可以通过运行 az account show 或使用 PowerShell 命令 Get-AzContext 来获取。

[玩转系统] Azure Functions 和 Azure AD 身份验证

现在我们应该能够浏览到我们的函数,重定向到登录页面,然后到达我们的函数。就那么简单!

验证结论

总而言之,如果您准备花几分钟而不是几秒钟来配置身份验证,那么走所谓的高级路线是非常值得的!

正如我们在上面所看到的,要获取访问令牌,我们需要在 Azure AD 中注册一个应用程序。到目前为止,我们创建的应用程序旨在充当 Web 服务器应用程序。这意味着当用户登录时,令牌颁发者(在本例中为 Azure AD)不会将访问令牌返回给客户端,Azure AD 会将其发送到客户端指定的重定向 URI。 Azure AD 将仅接受我们的应用程序注册中列出的重定向 URI。这意味着仅添加正确的重定向URI 极其重要。

在上面的高级场景中,我们将此重定向 URI 设置为我们的函数 URI,后跟“/.auth/login/aad/callback”。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯