【发布时间】:2017-08-15 14:14:34
【问题描述】:
我正在将我的应用程序从 Azure Active Directory 身份验证切换到使用 Identity Server 进行身份验证(使用 Azure AD 作为外部身份验证)。实现了身份验证和授权部分,我的 Web API 成功验证了令牌并给出了我的要求。
我们的应用程序还使用需要 Azure AD 令牌的外部 API,例如 Graph API 和 SharePoint Online。例如。当我使用从 Identity Server 返回的令牌从我的 JS 应用程序转到 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 的正确方法是什么?
编辑:
我所希望的就是这个。
- 点击Js(或任何其他客户端应用)上的登录按钮
- 重定向到 Identity Server 登录屏幕
- 单击 Azure AD 外部身份验证
- 重定向到 Microsoft 登录页面并在此处输入您的凭据
-
重定向到身份服务器应用程序
一个。我启动了 Fiddler,看到“Microsoft”重定向到
{IdentityServerAppUrl}/signin-aad(我想这是因为我在 OpenID Connect 选项上配置了CallbackPath属性)。这个请求携带一个cookieidsrv.external。我不确定,但我认为里面是来自 Azure AD 的访问令牌。我不知道如何解码。我尝试使用 base64,但它不起作用。b.当这个请求完成时,重定向到
{IdentityServerAppUrl}/account/ExternalLoginCallback。在此操作方法中,我使用调试器检查请求中的所有字段和数据,但我无法从 AAD 中找到令牌。我希望得到令牌并将其放入额外的 calims 中。 - Identity Server 应用程序重定向到 JS 客户端应用程序,该应用程序具有自己的令牌和包含在图形 API 和 SharePoint 上有效的 Azure AD 令牌的附加声明。
首先我想找到处理{IdentityServerAppUrl}/signin-aad的Action方法或中间件?
第二,有没有办法从 Azure AD 或{IdentityServerAppUrl}/account/ExternalLoginCallback Action 方法中的任何其他外部提供者获取令牌?
请注意,我是这种东西的新手,也许我对这种想法完全错误。
我设法在没有 Identity Server 的情况下进行 Azure AD 身份验证,但知道我们要求拥有多个外部提供程序,我希望在一个应用程序中处理所有身份验证。如果有一天我收到要求有额外的外部供应商的请求,我只需要在一个地方添加。
【问题讨论】:
-
您可以尝试在身份服务器中使用 OpenID Connect ASP.Net OWIN 中间件获取 microsoft graph api 的访问令牌,然后将访问令牌/刷新令牌与用户身份信息一起存储在数据库中。使用用户身份在数据库中搜索访问令牌/刷新令牌以调用 microsoft graph。
-
这个解决方案在我脑海中闪过,但我希望能找到更简单的方法。类似于告诉身份服务器 4 使用 AzureAd 令牌而不是创建自己的令牌。仅用于其他提供商的 AzureAd 外部身份验证的总线使用默认行为。
标签: azure-active-directory identityserver4 azure-ad-graph-api