首页 文章

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

提问于
浏览
0

我正在将我的应用程序从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令牌中的所有声明复制到身份服务器令牌中,但没有更改 .

What would be the right approach to enable my application to continue using APIs which require Azure AD token?

EDIT:

我希望的是这个 .

  • 点击Js(或任何其他客户端应用程序)上的登录按钮

  • 重定向到Identity Server登录屏幕

  • 单击Azure AD外部身份验证

  • 重定向到Microsoft登录页面并在那里输入您的凭据

  • 重定向到身份服务器应用程序

一个 . 我启动了Fiddler并看到"Microsoft"重定向到 {IdentityServerAppUrl}/signin-aad (我想这是因为我在OpenID Connect选项上配置了 CallbackPath 属性) . 此请求带有cookie idsrv.external . 我'm not sure but I think inside is access token from Azure AD. I don'知道如何解码这个 . 我尝试使用base64,但它无法正常工作 .

湾完成此请求后,将重定向到 {IdentityServerAppUrl}/account/ExternalLoginCallback . 在这个动作方法中,我用调试器检查请求中的所有字段和数据,但我可以't find token from AAD. I' m希望获得令牌并将其放入其他calims中 .

  • Identity Server应用程序使用自己的令牌和包含在图API和SharePoint上有效的Azure AD令牌的其他声明重定向到JS客户端应用程序 .

First I would like to locate Action method or middleware that handle /signin-aad?

Second, is there any way to get token from Azure AD or any other external provider inside /account/ExternalLoginCallback Action method?

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

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

2 回答

  • 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,你可以使用它,如果它工作:

相关问题