Azure Active Directory 为 API 管理灾难恢复抛出“未实现”

Posted

技术标签:

【中文标题】Azure Active Directory 为 API 管理灾难恢复抛出“未实现”【英文标题】:Azure active directory throwing "Not implemented" for api management disaster recovery 【发布时间】:2019-08-23 23:18:09 【问题描述】:

我正在关注微软文档上的这个api management disaster recovery 指南,我已经设置了我的活动目录用户并从配置中获取了值(如建议的那样),然后复制并粘贴了示例中的代码

var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/xxxx");
var result = await authenticationContext.AcquireTokenAsync("https://management.azure.com/", "xxx", new Uri("https://resource.com"), new PlatformParameters());    

似乎建议的new PlatformParameters(PromptBehavior.Auto) 不起作用,因为该对象不再需要您将参数传递给构造函数,我收到NotImplemented 异常:

System.NotImplementedException : The method or operation is not implemented.
   at Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters.GetCoreUIParent()
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenInteractiveHandler.CreateWebUIOrNull(IPlatformParameters parameters)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenInteractiveHandler..ctor(RequestData requestData, Uri redirectUri, IPlatformParameters platformParameters, UserIdentifier userId, String extraQueryParameters, String claims)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireTokenCommonAsync(String resource, String clientId, Uri redirectUri, IPlatformParameters parameters, UserIdentifier userId, String extraQueryParameters, String claims)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireTokenAsync(String resource, String clientId, Uri redirectUri, IPlatformParameters parameters)

我觉得租户、应用程序 ID 的值可能是错误的,所以我将尽我所能描述我从哪里获得这些值:

租户 ID:

在 azure Active Directory 选项中单击“应用注册”选项 找到并点击“端点” 复制出 oauth 端点 获取 url 中的 guid 并将其粘贴到 var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/here");

应用程序 ID

在 azure Active Directory 选项中单击“应用注册”选项 查找并单击具有所需权限的用户 点击设置 点击列表中的“属性”选项 复制出“应用程序ID” 粘贴var result = await authenticationContext.AcquireTokenAsync("https://management.azure.com/", "here", new Uri("https://resource.com"), new PlatformParameters());

编辑:查看反编译的源代码,我实际上找到了问题的原因,似乎它调用了平台参数类到GetCoreUiParent,这根本没有实现:

public class PlatformParameters : IPlatformParameters

    internal CoreUIParent GetCoreUIParent()
    
      throw new NotImplementedException();
    

编辑 2 - 我觉得这里有点白痴,但似乎这个 nuget 的新版本已作为预览发布,它有一个新版本的 PlatformParameters 类,它有一个实现,但需要的参数比给出的例子,我觉得我在正确的轨道上

谢谢大家

【问题讨论】:

您可以随时发布自己问题的答案。它可以帮助未来遇到相同(或类似)问题的其他用户。 我还没弄明白,但是如果我弄明白了,我会试着回答我自己的问题 我在使用 .NET Core 2.1 时看到了这种行为 NotImplementedException。此获取令牌的代码应与 .NET Framework (Full) 控制台应用程序完美配合。我还注意到您已经从new PlatformParameters(PromptBehavior.Auto) 中删除了PromptBehavior.Auto,因为它也会破坏.NET Core。您所指的指南尝试使用Delegated Permissions,因此代码提示用户输入凭据。 根本问题是 .NET Core 不提供 UI,因此 .NET Core 不支持交互式流。具有非常相似代码的 GitHub 线程:github.com/AzureAD/azure-activedirectory-library-for-dotnet/… 我仍然在犹豫是否将其添加为答案,因为您没有提到您正在使用 .NET Core,但如果是这种情况并且您确认......我会尝试详细说明在一个答案中。 好的,在这种情况下,我建议您尝试使用 .NET Framework 控制台应用程序,指南中的相同代码应该适合您 【参考方案1】:

首先Microsoft Docs Guide you are referring中的步骤向Azure AD注册一个Native应用程序,然后使用Delegated Permissions。所以有代码提示用户登录并输入他们的凭据。

现在,此代码将与 .NET Framework (Full) 控制台应用程序完美配合,但不适用于 .NET Core。

static void Main(string[] args)

        var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/tenant id");
        var result = authenticationContext.AcquireTokenAsync("https://management.azure.com/", "application id", new Uri("redirect uri"), new PlatformParameters(PromptBehavior.Auto)).Result;

.NET Core 的根本问题是它不提供 UI 功能,因此 .NET Core 并不真正支持交互式流。

这也是您必须从 new PlatformParameters(PromptBehavior.Auto) 中删除 PromptBehavior.Auto 的原因,因为这会破坏 .NET Core。

您可以在下面提到的参考资料中找到更多信息:

这是 GitHub 上的一个线程,其代码与您的代码非常相似 Interactive authentication in .net core 2.0 console application on windows

GitHub 上的 ADAL 文档。看清楚说Except for .NET Core, which does not provide any user interaction


顺便说一句,我知道.NET Core 3.0 即将推出support for Windows Desktop Applications,但仍处于预览阶段。

未来的交互流程应该适用于 .NET Core 3.0 和 MSAL.NET(不同于 ADAL.NET)。

更多详情:ADAL does not properly support .NET Core 3

【讨论】:

以上是关于Azure Active Directory 为 API 管理灾难恢复抛出“未实现”的主要内容,如果未能解决你的问题,请参考以下文章

Azure B2C 来宾(外部 Azure Active Directory)X 成员(联合 Azure Active Directory)

访问Azure Active Directory用户和角色

Azure Active Directory 图形客户端 2.0

Azure Active Directory Connect密码同步问题

Azure Active Directory document ---reading notes

努力让 Playwright 使用 Azure Active Directory 条件访问