【问题标题】:Identity Server 4 (with external Azure AD auth) token is not valid in Graph APIIdentity Server 4(带有外部 Azure AD 身份验证)令牌在 Graph API 中无效
【发布时间】:2017-08-15 14:14:34
【问题描述】:

我正在将我的应用程序从 Azure Active Directory 身份验证切换到使用 Identity Server 进行身份验证(使用 Azure AD 作为外部身份验证)。实现了身份验证和授权部分,我的 Web API 成功验证了令牌并给出了我的要求。

我们的应用程序还使用需要 Azure AD 令牌的外部 API,例如 Graph API 和 SharePoint Online。例如。当我使用从 Identity Server 返回的令牌从我的 JS 应用程序转到 https://graph.microsoft.com/v1.0/me 时,Graph API 响应是

401
{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.",
    "innerError": {
      "request-id": "ce7651bb-5dc4-49e9-90ff-02df440ed4ad",
      "date": "2017-08-11T08:53:12"
    }
  }
}

我希望这是因为 Identity Server 给了我他的令牌,而不是传递 Azure AD 提供的现有令牌。我将 Azure AD 令牌中的所有声明复制到身份服务器令牌中,但没有任何更改。

让我的应用程序继续使用需要 Azure AD 令牌的 API 的正确方法是什么?

编辑:

我所希望的就是这个。

  1. 点击Js(或任何其他客户端应用)上的登录按钮
  2. 重定向到 Identity Server 登录屏幕
  3. 单击 Azure AD 外部身份验证
  4. 重定向到 Microsoft 登录页面并在此处输入您的凭据
  5. 重定向到身份服务器应用程序

    一个。我启动了 Fiddler,看到“Microsoft”重定向到 {IdentityServerAppUrl}/signin-aad(我想这是因为我在 OpenID Connect 选项上配置了 CallbackPath 属性)。这个请求携带一个cookieidsrv.external。我不确定,但我认为里面是来自 Azure AD 的访问令牌。我不知道如何解码。我尝试使用 base64,但它不起作用。

    b.当这个请求完成时,重定向到{IdentityServerAppUrl}/account/ExternalLoginCallback。在此操作方法中,我使用调试器检查请求中的所有字段和数据,但我无法从 AAD 中找到令牌。我希望得到令牌并将其放入额外的 calims 中。

  6. Identity Server 应用程序重定向到 JS 客户端应用程序,该应用程序具有自己的令牌和包含在图形 API 和 SharePoint 上有效的 Azure AD 令牌的附加声明。

首先我想找到处理{IdentityServerAppUrl}/signin-aad的Action方法或中间件?

第二,有没有办法从 Azure AD 或{IdentityServerAppUrl}/account/ExternalLoginCallback Action 方法中的任何其他外部提供者获取令牌?

请注意,我是这种东西的新手,也许我对这种想法完全错误。

我设法在没有 Identity Server 的情况下进行 Azure AD 身份验证,但知道我们要求拥有多个外部提供程序,我希望在一个应用程序中处理所有身份验证。如果有一天我收到要求有额外的外部供应商的请求,我只需要在一个地方添加。

【问题讨论】:

  • 您可以尝试在身份服务器中使用 OpenID Connect ASP.Net OWIN 中间件获取 microsoft graph api 的访问令牌,然后将访问令牌/刷新令牌与用户身份信息一起存储在数据库中。使用用户身份在数据库中搜索访问令牌/刷新令牌以调用 microsoft graph。
  • 这个解决方案在我脑海中闪过,但我希望能找到更简单的方法。类似于告诉身份服务器 4 使用 AzureAd 令牌而不是创建自己的令牌。仅用于其他提供商的 AzureAd 外部身份验证的总线使用默认行为。

标签: azure-active-directory identityserver4 azure-ad-graph-api


【解决方案1】:

您需要从 AAD 检索 Graph API 的访问令牌 - 具体如何工作,请查看 Microsoft 文档。

获得该访问令牌后,您可以在 IdentityServer 身份或访问令牌中将其作为声明返回(取决于您希望将其提供给前端还是后端)。

您也可以先在一个简单的 MVC 应用程序中尝试移除移动部件 - 一旦您的 AD 部件工作,使用 identityserver 中间件将您的代码移动到应用程序。

【讨论】:

    【解决方案2】:

    我也在寻找这个问题的答案。但是,我认为它的工作方式应该有所不同。 IdentityServer 为您提供了一个 JWT,您可以使用它来授权构成您的应用程序的资源。例如:yourAPI-1 和 yourAPI-2。使用 JWT,您可以传递身份。 Microsoft Graph 是一种外部资源。因此,我们需要来自 Graph API 的访问令牌作为声明或外部资源,就像您接收内部资源的访问令牌一样。

    我猜应该有一种方法可以将您从身份提供者 (Azure AD) 获得的任何信息转发到 IdentityServer 以供您的客户端(JS 应用程序)获取。我在这里面临同样的问题。

    关于这个主题的另一个主题引起了我的注意,我将对其进行研究。它需要通过一些修改从源代码构建您的 IdentityServer:ASP.NET Identity (with IdentityServer4) get external resource oauth access token

    我会让你知道结果是什么,并将它推送到一个你可以使用的 git repo 中:

    【讨论】:

    • 永远需要修改 identityserver 的源代码 - 如果你这样做,你就错了。
    • 所以你是说运行一个与身份服务器流分开的流?
    • 没有。我在哪里说的?
    • 在您的回答中,您是说首先获取 Graph 访问令牌。然后将其作为索赔返回。您是否不需要针对 IDsrv 进行身份验证才能获得索赔?不要误会我的意思,你的答案很明确,但它并没有真正指出我们将如何以及在何处注入我们从 AzureAD 获得的令牌。一旦被 AzureAD 授权为外部登录提供程序,自动注入它会很好。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多