Identity Server 4(带有外部Azure AD身份验证)令牌在Graph API

时间:2017-08-15 14:14:34

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

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

我们的应用程序还使用外部API,例如需要Azure AD令牌的Graph API和SharePoint Online。例如。当我从我的JS应用程序使用令牌从Identity Server转到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 external auth
  4. 重定向到Microsoft登录页面并在那里输入您的凭据
  5. 重定向到身份服务器应用

    一个。我开始提琴手看到了#34;微软"重定向到{IdentityServerAppUrl}/signin-aad(我想这是因为我在OpenID Connect选项上配置了CallbackPath属性)。此请求带有Cookie idsrv.external。我不确定,但我认为内部是来自Azure AD的访问令牌。我不知道如何解码这个。我尝试使用base64,但它无法正常工作。

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

  6. Identity Server应用程序使用自己的令牌和包含在图API和SharePoint上有效的Azure AD令牌的其他声明重定向到JS客户端应用程序。
  7. 首先,我想找到处理{IdentityServerAppUrl}/signin-aad的Action方法或中间件?

    其次,有没有办法在{IdentityServerAppUrl}/account/ExternalLoginCallback操作方法中从Azure AD或任何其他外部提供商处获取令牌?

    请注意我对这种东西不熟悉,也许我对这种想法完全错了。

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

2 个答案:

答案 0 :(得分: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:

答案 1 :(得分:2)

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

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

您还可以在简单的MVC应用程序中首先尝试删除移动部分 - 一旦您使用AD部件,就可以使用身份服务器中间件将代码移动到应用程序。