使用Azure AD令牌进行Azure DevOps身份验证

3
我正在编写一个Web API。其中一项任务是使用Team Foundation Core DLLs访问Azure DevOps。由于我们是由Azure AD(Azure Active Directory)支持的,我认为可以让我的应用程序对Azure AD进行身份验证,并使用该令牌/授权来访问Azure DevOps。这不是唯一需要进行身份验证的服务。我能做到吗?还有其他方法可以实现此目标吗?我不想每次访问唯一的服务时都提示用户对Azure AD进行授权,尤其是它们都由Azure AD支持。
1个回答

4

是的,你可以这样做。

注:我假设你的 API 是由 Azure AD 保护的,并且为了调用你的 API,用户需要使用 Azure AD 登录到你的 API 的客户端。

假设你希望你的 API 不仅向 Azure DevOps 发出请求,还要向 Microsoft Graph(以另一个由 Azure AD 保护的 API 为例--当然可以是你自己的第二个 API)发出请求,并且你希望这些请求代表已登录的用户。也就是说,代表在 API 接收到的访问令牌中识别的用户。

你可以进行以下操作(下面是图示):

  1. 用户使用Azure AD登录客户端应用程序,并请求访问令牌以访问您的API。
  2. 在进行任何API请求时(例如在Authorization标头中),客户端应用程序向您的API提供此访问令牌。
  3. 您的API获取到接收到的访问令牌,并向Azure AD提出请求,请求代表签入用户从已呈现的访问令牌中“代表”不同资源(Azure DevOps)的“新”访问令牌。假设所有正确的权限和同意都已经设置好,Azure AD将会响应API并返回Azure DevOps的访问令牌。
  4. API在请求Azure DevOps时会呈现此访问令牌。
  5. 您的API还想调用Microsoft Graph(例如获取有关用户的更多详细信息或发送电子邮件等),因此API再次前往Azure AD,提供它在(2)中接收到的访问令牌,并请求Microsoft Graph的令牌。如果同意和权限检查通过,则Azure AD会遵守请求。
  6. 您的API在请求Microsoft Graph时会使用这第三个访问令牌。
          +--------+      +-----------+       +-----------------+
(User)+--->        +-(2)-->           +-(4)--->                 |
          | Client |      | Your API  <-------+  Azure DevOps   |
          |        <------+           |       |                 |
          +----^---+      |           +-(6)+  +-----------------+
               | |        |           <--+ |
               | |        +---^----^--+  | |  +-----------------+
               (1)          (3)   (5)    | +-->                 |
               | |           ||   ||     +----+ Microsoft Graph |
               | |        +--v----v--+        | (or other API)  |
               | +-------->          |        |                 |
               |          | Azure AD |        +-----------------+
               +----------+          |
                          +----------+

详细的令牌流程在Azure AD文档中有描述(针对v1端点v2端点)。当然,所有这些复杂性,以及令牌缓存和刷新,都应该由简单的库(如ADAL或MSAL)处理,两者都有关于on-behalf-of流程的维基页面(使用ADAL, 使用MSAL)。这是一个ADAL的示例摘要(来自To)
// Use ADAL to get a token On Behalf Of the current user.  To do this we will need:
//      The Resource ID of the service we want to call.
//      The current user's access token, from the current request's authorization header.
//      The credentials of this application.
//      The username of the user calling the API
//
string resourceId = "499b84ac-1321-427f-aa17-267ca6975798"; // this is the Azure DevOps app ID
string userName = "...";// get from incoming token
string userAccessToken = "..." // from incoming Authorization header;
UserAssertion userAssertion = new UserAssertion(userAccessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
ClientCredential clientCred = new ClientCredential(clientId, appKey);
AuthenticationContext authContext = new AuthenticationContext(authority, tokenCache);

// Now make the on-behalf-of request
result = await authContext.AcquireTokenAsync(resourceId, clientCred, userAssertion);
accessToken = result.AccessToken; // <-- this is a token for Azure DevOps!

你是说我可以使用相同的Azure AD令牌访问任何Azure AD身份验证服务(例如Azure DevOps)? - xtreampb
1
不,我的意思是一个服务可以交换用于自身的Azure AD访问令牌,以获取另一个受Azure AD保护的资源的访问令牌。 - Philippe Signoret
是的,那就是我想要传达的意思。使用AAD令牌进行身份验证,并获取Azure DevOps令牌。 - xtreampb
我该使用什么作为我的权限?我目前正在使用我的setup.auth中的内容:login.microsoftonline.com/${appID}。它应该只是login.microsoftonline.com,还是我的Azure DevOps URI? - xtreampb
它永远不应该是.../{app-id},那样行不通。权限应该是https://login.microsoftonline.com/{tenant-id-or-domain-name} - Philippe Signoret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接