Azure active directory Identity Server 4(带有外部Azure AD auth)令牌在图形API中无效

Azure active directory Identity Server 4(带有外部Azure AD auth)令牌在图形API中无效,azure-active-directory,identityserver4,azure-ad-graph-api,Azure Active Directory,Identityserver4,Azure Ad Graph Api,我正在将我的应用程序从Azure Active Directory身份验证切换到使用Azure AD作为外部身份验证的Identity Server身份验证。身份验证和授权部分已经实现,我的web API成功地验证了令牌,并给出了我的要求 我们的应用程序还使用外部API,例如需要Azure AD令牌的Graph API和SharePoint Online。我什么时候去上学https://graph.microsoft.com/v1.0/me 从我的JS应用程序和从Identity Server返

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

我们的应用程序还使用外部API,例如需要Azure AD令牌的Graph API和SharePoint Online。我什么时候去上学https://graph.microsoft.com/v1.0/me 从我的JS应用程序和从Identity Server返回的令牌中,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令牌中的所有声明复制到Identity Server令牌中,但没有任何更改

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

编辑:

我希望的是这个

单击Js或任何其他客户端应用程序上的登录按钮 重定向到Identity Server登录屏幕 单击Azure AD外部身份验证 重定向到Microsoft登录页面并在那里输入您的凭据 重定向到Identity server应用程序

a。我启动了Fiddler,看到Microsoft重定向到{IdentityServerAppUrl}/signin aad,我想这是因为我在OpenID连接选项上配置了CallbackPath属性。此请求包含cookie idsrv.external。我不确定,但我想里面是Azure广告的访问令牌。我不知道如何解码。我尝试使用base64,但它不起作用

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

Identity Server应用程序重定向到JS客户端应用程序,其中包含自己的令牌和附加声明,该声明包含在graph API和SharePoint上有效的Azure AD令牌。 首先,我想找到处理{IdentityServerAppUrl}/signin aad的操作方法或中间件

其次,在{IdentityServerAppUrl}/account/ExternalLoginCallback操作方法中,是否有任何方法可以从Azure AD或任何其他外部提供程序获取令牌

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


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

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

我想应该有一种方法将您从身份提供商Azure AD获得的任何信息转发到identity Server,以便您的客户端JS应用程序获取。我在这里也面临同样的问题

关于这个话题还有另一条线索引起了我的注意,我将对此进行探讨。需要从源代码构建IdentityServer,只需进行一些修改:


我会让你知道结果是什么,并把它推到git回购协议上,如果它有效,你可以使用它:

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

我想应该有一种方法将您从身份提供商Azure AD获得的任何信息转发到identity Server,以便您的客户端JS应用程序获取。我在这里也面临同样的问题

关于这个话题还有另一条线索引起了我的注意,我将对此进行探讨。需要从源代码构建IdentityServer,只需进行一些修改:


我会让您知道结果是什么,并将其推送到git repo,如果它有效,您可以使用它:

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

拥有该访问令牌后,您可以将其作为声明返回到IdentityServer标识或访问令牌中,具体取决于您是否希望将其提供给用户 前端或后端


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

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

拥有该访问令牌后,您可以将其作为声明返回到IdentityServer标识或访问令牌中,具体取决于您是否希望使其可用于前端或后端


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

您可以尝试使用identity server中的OpenID Connect ASP.Net OWIN中间件获取microsoft graph api的访问令牌,然后将带有用户标识信息的访问令牌/刷新令牌存储在数据库中。使用用户标识在数据库中搜索access token/refresh token以调用microsoft graph。这个解决方案在我脑海中闪过,但我希望找到更简单的方法。类似于告诉Identity server 4用户AzureAd令牌来创建自己的令牌。其他提供程序的AzureAd外部身份验证总线使用默认行为。您可以尝试在identity server中使用OpenID Connect ASP.Net OWIN中间件获取microsoft graph api的访问令牌,然后将带有用户标识信息的访问令牌/刷新令牌存储在数据库中。使用用户标识在数据库中搜索access token/refresh token以调用microsoft graph。这个解决方案在我脑海中闪过,但我希望找到更简单的方法。类似于告诉Identity server 4用户AzureAd令牌来创建自己的令牌。总线仅用于AzureAd的外部身份验证用于其他提供商使用默认行为。您永远不需要修改identityserver的源代码-如果您这样做,那么您是在做错误的事情。因此,您是说运行与identityserver流分离的流?不。我在哪里说的?在您的回答中,您是说首先获取图形访问令牌。然后作为索赔退回。您不需要针对IDsrv进行身份验证才能获得索赔吗?别误会我的意思,你的答案很清楚,但它并没有真正指出我们将如何以及在哪里注入我们从AzureAD获得的toking。一旦获得AzureAD作为外部登录提供商的授权,它就会自动注入。您永远不需要修改identityserver的源代码-如果您这样做,你做错了。那么你是说运行一个与identityserver流分离的流?不。我在哪里说的?在你的回答中,你是说首先获取一个图形访问令牌。然后作为索赔退回。您不需要针对IDsrv进行身份验证才能获得索赔吗?别误会我的意思,你的答案很清楚,但它并没有真正指出我们将如何以及在哪里注入我们从AzureAD获得的toking。一旦AzureAD作为外部登录提供商授权,它就会自动注入。