azure - 如何使用应用服务对 Azure 函数应用进行身份验证/授权?

标签 azure azure-active-directory azure-mobile-services

我有一个 Azure 应用服务以及一个函数应用(我目前正在学习 Azure,如果有其他方法可以实现我想要的目标,我愿意接受建议)。该应用程序服务包含一个简单的表,我想与应用程序同步(该应用程序已经在运行),并且我想使用 Blob 存储输入绑定(bind)或填充该简单表的计时器触发器来实现一个功能。

由于似乎没有简单表格的输出绑定(bind),我遵循 this answer并使用 MobileServiceClient 实现访问。

MobileServiceClient client = new MobileServiceClient("https://my-app.azurewebsites.net");
var table = client.GetTable<MyTableClass>();
await table.InsertAsync(myObject);

只要表是公开可写的,它就有效,但是当它是匿名可读的,但只能对经过身份验证的用户写入时,它当然不起作用。为了验证我的函数,我创建了一个 Azure Active Directory 并为该 AD 中的应用程序创建了一个 API key ,然后我尝试通过

验证 MobileServiceClient
await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, 
                        new JObject {{"access_token", "<my API key>"}});

但这并没有成功。我总是收到错误

The request could not be completed. (Unauthorized).

显然这是行不通的(以这种方式使用 API key 实际上只是在黑暗中尝试),但我不确定如何从我的函数应用程序完成身份验证。我知道当我在应用内使用 MobileServiceClient 时,我可以重定向用户进行登录,但这(显然)不适用于函数。

如何使用现有应用服务验证我的函数,以便写入不可匿名写入的表?

最佳答案

应用服务无法通过 API key 进行简单访问,但需要通过 Active Directory 进行完整身份验证才能访问应用服务。为了实现这一点,可以使用 ADAL (Active Directory Access Library)。

AuthenticationContext

ADAL 定义了 AuthenticationContext 类,它是使用 Active Directory 进行身份验证的帮助程序。首先创建一个新的AuthenticationContext

var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/<Directory ID>");

您可以通过访问 Azure 门户中的 Azure Active Directory 找到目录 ID,然后从 Azure Active Directory 打开属性菜单。在“属性”菜单中,有一个包含“目录 ID”的文本框。

使用 Azure Active Directory 进行身份验证

您现在可以通过以下方式进行身份验证

var authenticationResult = await authenticationContext.AcquireTokenAsync(
      "https://batch.core.windows.net/", 
      new ClientCredential("<app ID>", "<app secret>"));

我假设已经有一个已注册的应用程序。要获取应用 ID,请访问 Azure Active Directory应用注册<您的应用>,您可以在其中找到应用程序 ID(也在属性下)。

接下来,您必须为应用创建 key 。因此,请访问Azure Active Directory应用程序注册<您的应用程序> key 。您可以在其中创建 key ,只需输入 key 名称和有效期,然后单击“保存”。保存后会显示 key 。 (注意: key 之后无法恢复。将其保存在某个地方。)

MobileServiceClient

最后一步是创建 MobileServiceClient。由于 UI 登录不可用,我们必须手动创建登录用户(请参阅 here )。

MobileServiceClient client = new MobileServiceClient("https://my-app.azurewebsites.net");
client.CurrentUser = new MobileServiceUser("Foo:123456789");
client.CurrentUser.MobileServiceAuthenticationToken = authenticationResult.AccessToken;

现在,MobileServiceClient 已通过身份验证并可供使用。

进一步阅读

https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service

https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios#web-application-to-web-api

https://learn.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.clients.activedirectory.authenticationcontext?view=azure-dotnet

https://learn.microsoft.com/en-us/azure/batch/batch-aad-auth

关于azure - 如何使用应用服务对 Azure 函数应用进行身份验证/授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47152603/

相关文章:

.net - 尝试通过 Azure 移动服务 SDK 发布时不允许使用 Azure 方法

azure - Azure 移动应用程序的最低依赖关系

android - Azure 移动服务 SDK 可通过 Android 版 Gradle 获取吗?

c# - 如何配置**本地**运行的 Azure Function 以使用 Azure B2C 执行身份验证?

sql-server - 将 Excel 数据从 Azure Data Lake 加载到 Azure SQL 的理想方法

azure - 获取服务主体的 "Roles and administrators"

Azure Graph API - 批准 PIM 请求

javascript - 无法使用 JavaScript 通过 Outlook 帐户登录 Azure AD v2 帐户

azure - 如何在 KQL 上创建转化指标

deployment - 无法运行 Set-AzureDeployment