【问题标题】:Azure AD authentication token fails web api authorizationAzure AD 身份验证令牌未通过 Web api 授权
【发布时间】: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。那里的任何其他值都无法通过身份验证过程。

标签: c# azure azure-active-directory adal


【解决方案1】:

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

谢谢你!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2018-07-01
    • 2014-11-18
    • 2022-09-23
    • 1970-01-01
    • 2018-01-20
    • 2021-06-19
    相关资源
    最近更新 更多