0

我将应用程序从Azure Active Directory身份验证切换为使用Identity Server进行身份验证(使用Azure AD作为外部身份验证)。身份验证和授权部分已经实现,我的web API成功验证了令牌,并给我我要求的东西。图形API中的Identity Server 4(具有外部Azure AD身份验证)令牌无效

我们的应用程序还使用外部API,例如需要Azure AD令牌的Graph API和SharePoint Online。例如。当我去https://graph.microsoft.com/v1.0/me我与令牌JS应用程序,我回来从身份服务器,图形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?

编辑:

什么,我希望是这样的。上的js

  1. 点击登录按钮(或任何其他客户端应用程序)
  2. 重定向到Identity Server登录屏幕
  3. 点击Azure的AD外部认证
  4. 重定向到微软的登录页面,输入您的凭据有
  5. 重定向到身份服务器应用程序

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

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

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

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

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

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

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

+1

您可以尝试使用OpenID Connect ASP.Net身份服务器中的OWIN中间件获取microsoft graph api的访问令牌,然后将访问令牌/刷新令牌与用户标识信息一起存储在数据库中。使用用户标识在数据库中搜索访问令牌/刷新令牌以调用Microsoft图形。 –

+0

这个解决方案经过我的头,但我希望找到更简单的东西。像告诉身份服务器4到用户AzureAd令牌,而不是创建他自己的。总线仅用于其他提供商的AzureAd的外部认证使用默认行为。 –

回答

0

我也在寻找这个问题的答案。不过,我认为它应该有点不同。 IdentityServer为您提供了一个JWT,您可以使用它来对组成应用程序的资源进行授权。例如:yourAPI-1和yourAPI-2。通过智威汤逊,您可以传递身份信息。 Microsoft Graph是外部资源。因此,我们需要将图形API的访问令牌作为索赔或外部资源,与获得内部资源的访问令牌的方式相同。

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

还有另一个关于这个话题的线程引起了我的注意,我会研究。它需要从源头上有一些改动构建IdentityServer:ASP.NET Identity (with IdentityServer4) get external resource oauth access token

,我会让你知道结果是什么,并把它推到一个混帐回购协议,如果它的工作原理,你可以使用:

+0

你从不**需要修改标识服务器的源代码 - 如果你这样做,你做错了。 – leastprivilege

+0

所以你说的是从身份服务器流程中运行流程分离? –

+0

不,我说的是哪里? – leastprivilege

2

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

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

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