【问题标题】:Azure AD OAuth Client Credentials Grant flowAzure AD OAuth 客户端凭据授予流
【发布时间】:2019-12-03 00:58:03
【问题描述】:

尝试为我的 Web api 设置 Azure AD OAuth 客户端凭据授予流程。我正在关注https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow 中的文档。我必须将我的 API 暴露给第三方。我已经在 Azure AD 中创建了 APP(这是针对请求我的 API 的客户端),生成了机密并能够从 oauth2/token 端点获得响应。我的问题如下:

  1. 验证令牌的最佳方法是什么?是不是通过JWT (不记名令牌)作为我的 API 的 HTTP 标头,然后使用 SDK 来 验证令牌 (System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler)?我正在使用 C#。
  2. Azure AD有什么意义->应用注册->“我的 API App" -> 在管理下,公开 API?它有一个选项 “授权客户端应用程序”。我怎么能用这个功能来 有条件地阻止和批准客户申请?

  3. 我必须与第 3 方共享密钥、客户端 ID 和 App Id Uri,以便他们生成令牌,并在收到令牌时验证令牌。

【问题讨论】:

    标签: azure oauth-2.0 azure-active-directory


    【解决方案1】:

    你在正确的轨道上。

    这个答案 Azure AD OAuth client credentials grant flow with Web API AuthorizeAttribute Roles 将引导您完成此操作,使用令牌中的 roles 声明来授权调用。

    您需要:

    • 定义角色
    • 为每个第 3 方创建一个应用注册
    • 将他们的应用分配给您想要的角色

    然后您可以使用AuthorizeAttribute 映射哪些角色可以执行哪些控制器/操作,如下所示:

    [Authorize(Roles = "Reader,Requester,Editor,Approver,Administrator")]
    

    【讨论】:

      【解决方案2】:
      1. 令牌验证

      完成令牌获取流程后,您会收到一个 JWT 不记名访问令牌。从令牌消费端(您的服务)开始,您需要执行 JWT 验证。这是通过验证 JWT 签名和声明来完成的。您验证的最重要声明之一是受众 (aud) 声明,它必须是令牌接收服务唯一的标识符(例如:您的服务的 URL、ID) .你在哪里注册这个?这是你的第二个问题。

      请阅读 MS 的令牌验证指南,其中解释了关键点 - Microsoft identity platform access tokens

      1. 服务注册

      这是您注册有效令牌可接收端点的地方(例如:-您的 api 应用程序)。如果您检查您的令牌请求,您提供的 resource 参数必须与注册标识符匹配。这允许 Azure 验证令牌请求并为提到的资源颁发访问令牌。您可以在令牌中找到 aud 声明。希望您现在已建立连接。

      1. 应用密码

      不,只有令牌获取方需要客户端凭据。您的 API 或任何令牌消费方不需要该密钥。它们只需要有效的访问令牌和令牌签名证书详细信息。证书详细信息在 openid-configuration 端点的 jwks_uri 中公开。

      【讨论】:

      • 能否提供点2(服务注册)的更多细节(示例)我不明白如何使用授权客户端应用程序字段,这里我必须插入一个clientId但是呢?
      • 我检查了文件。它显示如下“输入接收 Web 服务的 App ID URI。要查找 App ID URI,请在 Azure 门户中单击 Azure Active Directory,单击应用注册,单击服务应用程序,然后单击设置和属性。”您必须将您的令牌接收 api 注册到 Azure(这是有道理的。!)。然后你得到一个 AppID 。不幸的是,我没有亲自做过。
      • @Max 关于注册的一些解释。基本上,您希望接收由已知服务使用的令牌。 Azure 要发行这样的令牌,它必须首先知道这样的服务(例如:- API)。否则无法在 JWT 中设置适当的子声明。希望你掌握了这个概念。
      • 即使我不做“公开API”并为“授权客户端应用程序”添加客户端ID,令牌请求应用程序仍然可以在令牌请求中发送资源ID并获取令牌,这将由我的 API 验证,该 API 将使用令牌。既然如此,那么使用“Expose an API”有什么影响呢?
      • @Thomas 我认为您不能简单地将随机值发送到资源参数。 Azure 应该对其进行验证才能知道。这对安全性的影响。您需要在 API、Azure(令牌颁发者)和 API 使用者之间创建信任边界。令牌发行者必须知道它向谁发行令牌。
      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 2021-04-10
      • 1970-01-01
      • 2019-06-16
      • 2017-03-11
      • 2018-02-08
      • 2020-11-18
      • 2023-03-25
      相关资源
      最近更新 更多