首页 > 解决方案 > 为来宾用户从 Azure Active Directory 获取访问令牌时出现异常

问题描述

我正在尝试为 Azure 活动租户中的来宾用户获取 Azure Active Directory 访问令牌。我能够为在 Azure AD 中创建的普通用户获取访问令牌,但是当我为来宾用户使用用户名(电子邮件)和密码时,我遇到了异常:

Accessing_ws_metadata_exchange_failed: Accessing WS metadata exchange failed

内部异常:

Response status code does not indicate success: 406 (NotAcceptable).

负责获取令牌的代码:

var context = new AuthenticationContext($"{cloud}/{tenant}");
var credentials = new UserPasswordCredential(user, password);
var result = await authenticationContext.AcquireTokenAsync(resource, client, credentials);

链接到 MSND:AuthenticationContext

我想问题可能与代码无关,而与 Azure Active Directory 配置有关。

我更改了 Azure Active Directory > 用户 > 用户设置 > 外部协作设置 > 来宾用户权限限制为 NO,但没有帮助。

有什么建议么?

标签: c#azureazure-active-directory

解决方案


是的,您使用的登录流程不适用于联合用户(例如这些来宾)。如果你想支持他们,你将不得不切换到使用不同的流程。您在此处使用的资源所有者密码凭据 (ROPC) 授权流程实际上只是作为传统升级路径,而不是真正的现代身份验证。

顺便说一句,该登录流程也不支持具有多重身份验证或密码过期的用户。

根据您的应用类型,您可以从不同的流程中进行选择:

  • 授权码(后端网页应用/原生应用)
  • 设备代码(设备上无法显示 Web 视图的本机应用程序)

在后端 Web 应用程序的情况下,授权代码流的工作原理是您将用户重定向到登录,获取您交换令牌的代码。

在本机应用程序中,可以通过向用户显示登录页面的弹出窗口来使用它。它可以通过不同的重载来使用AcquireTokenAsync()。不要使用接受 a 的那个UserPasswordCredential

设备代码要求您在 ADAL 上使用两个函数:AcquireDeviceCodeAsyncAcquireTokenByDeviceCodeAsync. 您调用第一个,向用户显示返回的消息,然后等待第二个。用户将需要打开浏览器,并在此处输入消息中显示的代码。有关此流程的更多信息:https ://joonasw.net/view/device-code-flow


推荐阅读