服务主体如何登录我的 Azure 应用程序服务?

use*_*951 5 authentication azure azure-web-app-service

我已按照https://learn.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad在我的应用程序服务中启用了身份验证现在,每当我访问我的网站端点时,我都会被重定向到Azure AD 登录页面,输入凭据后即可继续。如何使用服务主体凭据登录?登录页面显然不接受客户端 ID。我是否应该填充一些标头才能使用服务主体凭据发出成功的请求?

见解将受到高度赞赏。

Roh*_*gal 4

您是对的,交互式身份验证流程(例如登录页面)不适用于应用程序和服务主体,它们仅适用于最终用户。

关于如何进一步进行的几个要点:

  1. 利用非交互式身份验证流程,例如OAuth 2.0 客户端凭据授予来获取令牌。

    您可以根据您的平台使用相关的 ADAL 库,或直接点击 Azure AD 端点。

    以下是直接访问 Azure AD 端点的示例。此示例使用客户端密钥,如果与您的情况相关,也可以使用证书而不是密钥。我上面共享的客户端凭据授予链接中的示例确实表明了这一点。

    POST /contoso.com/oauth2/token HTTP/1.1
    Host: login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=client_credentials&client_id=625bc9f6-3bf6-4b6d-94ba-e97cf07a22de&client_secret=qkDwDJlDfig2IpeuUZYKH1Wb8q1V0ju6sILxQQqhJ+s=&resource=https%3A%2F%2Fservice.contoso.com%2F
    
    Run Code Online (Sandbox Code Playgroud)

    以下是使用 ADAL for .NET 的另一个示例 -在守护程序应用程序或长时间运行的进程中调用 Web API

    需要注意的代码的一个重要部分位于Program.cs中

    authContext = new AuthenticationContext(authority);
    clientCredential = new ClientCredential(clientId, appKey);
    AuthenticationResult result = await authContext.AcquireTokenAsync(todoListResourceId, clientCredential);
    
    Run Code Online (Sandbox Code Playgroud)

    您没有明确提到您正在使用哪个平台,因此我共享了 .NET 示例,因为这是我最熟悉的平台。如果您需要不同的库,请参阅 Microsoft Docs - Azure Active Directory 身份验证库上的指南,它链接到所有不同的受支持的 Microsoft 库,并且每个库都有一些相关示例。

  2. 从权限的角度来看,您的服务主体将需要分配Application Permissions给相关的 Web 应用程序。另一种类型的权限是Delegated Permissions但它们仅适用于用户。

  3. 当您询问要填充什么标头时,它将是标准Authorization标头。值的格式为Bearer <access token>. 如果您使用 ADAL 等身份验证库,那么库将处理这部分,但如果您直接访问 REST 端点,则需要填充标头。