从Azure Active Directory为来宾用户获取访问令牌时发生异常

时间:2018-11-08 15:41:58

标签: c# azure azure-active-directory

我正在尝试为Azure Active Tenant中的来宾用户获取Azure Active Directory访问令牌。我可以为在Azure AD中创建的普通用户获取访问令牌,但是当我为来宾用户使用userName(电子邮件)和密码时,却出现异常:

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:AuhtenticationContext

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

我更改了Azure Active Directory>用户>用户设置>外部协作设置>来宾用户权限仅限于NO,但无济于事。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

是的,您使用的登录流程实际上不适用于联合用户(例如这些来宾)。 如果要支持他们, 您将不得不切换到使用其他流程。 您在此处使用的“资源所有者密码凭证”(ROPC)授予流仅是真正的旧版升级路径,并不是真正的现代认证。

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

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

  • 授权码(后端网络应用/本地应用)
  • 设备代码(设备上的本机应用无法显示网络视图)

对于后端Web应用程序, 通过将用户重定向到登录名,授权码流起作用, 找回您用来交换令牌的代码。

在本机应用程序中,可以通过向用户显示登录页面的弹出窗口来使用它。 可以通过Mappings: DomainResourceMapping: DUBCrossAccountIAMRole: beta: "xyz" prod: "act" Resources: LambdaFunction: Type: AWS::Serverless::Function Properties: Handler: '...t' Runtime: java8 CodeUri: Bucket: ... Key: ... Description: nn Timeout: 20 MemorySize: 512 Environment: Variables: DUB_CROSS_ACCOUNT_IAM_ROLE: - Fn::FindInMap: - DomainResourceMapping - DUBCrossAccountIAMRole - {Ref: Stage} 的不同重载来使用它。 请勿使用接受AcquireTokenAsync()的人。

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