我正在将我的应用程序从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的正确方法是什么?
修改
我希望的是这个。
重定向到身份服务器应用
一个。我开始提琴手看到了#34;微软"重定向到{IdentityServerAppUrl}/signin-aad
(我想这是因为我在OpenID Connect选项上配置了CallbackPath
属性)。此请求带有Cookie idsrv.external
。我不确定,但我认为内部是来自Azure AD的访问令牌。我不知道如何解码这个。我尝试使用base64,但它无法正常工作。
湾完成此请求后,将重定向到{IdentityServerAppUrl}/account/ExternalLoginCallback
。在此操作方法中,我使用调试器检查请求中的所有字段和数据,但我无法从AAD中找到令牌。我希望得到令牌并将其放入额外的卡里姆。
首先,我想找到处理{IdentityServerAppUrl}/signin-aad
的Action方法或中间件?
其次,有没有办法在{IdentityServerAppUrl}/account/ExternalLoginCallback
操作方法中从Azure AD或任何其他外部提供商处获取令牌?
请注意我对这种东西不熟悉,也许我对这种想法完全错了。
我设法在没有Identity Server的情况下进行Azure AD身份验证,但我们知道我们要求拥有多个外部提供程序,而且我希望在一个应用程序中处理所有身份验证。如果有一天我得到了额外的外部提供商的请求,我需要在一个地方添加。
答案 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部件,就可以使用身份服务器中间件将代码移动到应用程序。