Azure AD 身份验证令牌未通过 Web api 授权

Posted

技术标签:

【中文标题】Azure AD 身份验证令牌未通过 Web api 授权【英文标题】:Azure AD authentication token fails web api authorization 【发布时间】:2019-10-14 22:14:13 【问题描述】:

我在 Azure 上有一个需要授权的 web-api,我正在使用 Azure AD 对帐户进行身份验证并生成访问令牌。

我可以通过两种不同的方式通过 ADAL 为同一帐户成功地从 Azure AD 获取访问令牌,但其中只有一种由 web-api 授权,另一种失败。

下面是交互认证账号,token是web-api授权的

result = AuthenticationContext.AcquireTokenAsync(resource, clientId, redirectUri, new PlatformParameters(PromptBehavior)).Result;

其中资源是 web-api 应用程序 ID (guid)。

以下是使用给定的用户名和密码以非交互方式对帐户进行身份验证,但令牌未经 web api 授权

UserPasswordCredential cred = new UserPasswordCredential(userName, password);
result = AuthenticationContext.AcquireTokenAsync(resource, clientId, cred).Result; 

其中资源 = https://tenant/api 名称。

web-api调用如下:

HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
HttpResponseMessage response = await httpClient.GetAsync(ApplicationCallUri);

两种方式都返回相同的 AuthenticationResult 对象(除了令牌和时间戳),我看不出为什么第二种方式授权失败。

web-api 响应是“此请求的授权已被拒绝。”

由于两种方式的身份验证都成功,我认为它一定是 web-api 方面的东西。非常感谢您的帮助。谢谢。

【问题讨论】:

检查令牌 aud 声明(受众)。它必须是为 API 配置的有效受众之一。这就是资源所定义的。另外,如果可能的话,我会远离自己处理用户密码。例如,如果用户有 MFA,它将无法工作。 第二种失败的资源是 web-api 的应用程序 ID URI。那里的任何其他值都无法通过身份验证过程。 【参考方案1】:

感谢 juunas 指出了观众参数,我意识到 web api 被设置为仅期望两个观众值之一的令牌。我为承载身份验证添加了第二个选项,它适用于两种情况。

谢谢你!

【讨论】:

以上是关于Azure AD 身份验证令牌未通过 Web api 授权的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API

尝试使用 protobuf-net 通过 gRPC-Web 进行 Azure AD 身份验证

Azure AD 与 Web API 的不记名令牌身份验证无法正常工作并抛出错误,因为“此请求的授权已被拒绝”。

使用 Azure AD 承载令牌时身份验证失败,返回容器列表 [Azure Blob] [Azure AD OAuth 2.0] [REST API]

具有 Azure AD 身份验证的 Azure 函数 - 允许的令牌受众不适用于 Microsoft Graph

如何在 Web 应用程序中从 Azure AD 刷新 ID 令牌?