我应该在 MSAL.NET 中使用哪种类型的 ApplicationBuilder?我正在使用 ASP.NET Core Web Api

Posted

技术标签:

【中文标题】我应该在 MSAL.NET 中使用哪种类型的 ApplicationBuilder?我正在使用 ASP.NET Core Web Api【英文标题】:What type of ApplicationBuilder should I use in MSAL.NET? I'm using ASP.NET Core Web Api 【发布时间】:2022-01-16 17:12:36 【问题描述】:

我想要实现的是从 MSAL.NET 弹出登录浏览器,输入用户名和密码,并使用访问令牌访问 Microsoft Graph。

现在我使用 PublicClientApplicationBuilder 执行 AcquireTokenInteractive 以通过 MSAL 弹出登录。

我正在使用 ASP.NET Core Web Api。

问题是,我在部署到 IIS 时使用 PublicClientApplicationBuilder 时遇到问题。它只是卡住并始终处于待处理状态。

以下是我在部署到 IIS 时始终处于待处理状态的示例代码:

        var app = PublicClientApplicationBuilder.Create(clientId)
            .WithDefaultRedirectUri()
            .WithTenantId(tenantId)
            .Build();

        var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();

现在我从这里读到一篇文章:https://docs.microsoft.com/en-us/answers/questions/91715/msal-acquiretokeninteractive-code-hangs-infinte-lo.html 使用 ConfidentialClientApplicationBuilder。现在的问题是在 ConfidentialClientApplicationBuilder 中没有执行来从 MSAL 弹出登录浏览器,就像 AcquireTokenInteractive 一样。

只有 AcquireTokenSilent、AcquireTokenByAuthorizationCode、AcquireTokenOnBehalfOf 和 A​​cquireTokenForClient。但是所有这些似乎都没有从 MSAL.NET 弹出登录浏览器

下面是我的示例代码:

        var confidentialClientApplication = ConfidentialClientApplicationBuilder
         .Create(clientId)
         .WithTenantId(tenantId)
         .WithClientSecret(clientSecret)
         .Build();

        var result = await confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

如何使用 ConfidentialClientApplicationBuilder 从 MSAL 弹出登录浏览器?

【问题讨论】:

你的前端是什么?它只是 ASP.NET Core Razor 视图吗?还是有单页应用框架(React 等)? 我使用 Angular 作为前端。但我希望使用 C# 在后端执行 MSAL。这可能吗? @AnthonyEarlR.Cuartero 不可能 使用 Angular 作为前端,你应该在前端集成 msal,包括登录流程。用户登录后,您可以生成访问令牌以调用 ms graph api。这是官方示例:github.com/Azure-Samples/… 【参考方案1】:

您应该首先了解 MSAL。您有一个 asp.net 核心 Web 应用程序,并且您希望您的用户在弹出窗口中登录并生成访问令牌以调用 Ms graph api,因此您需要参考 this document 将 azure 广告集成到您的 Web 应用程序中。

您在having issue when deployed to IIS 的问题中提到的内容来自使用错误方法。当您使用这些代码在本地进行测试时,您的本地计算机将成为服务器,它应该可以工作,但是如果您将应用程序发布到 IIS,这意味着用户会在客户端点击您的应用程序,但弹出操作将出现在服务器端。这就是为什么它总是挂起。

这里总结一下,如果您需要您的用户登录并生成具有委托api权限的访问令牌,您应该按照我上面发布的文档来实现该功能。但是如果你也可以使用应用权限生成访问令牌,那么你可以去使用graph SDK with client credential flow来实现。

【讨论】:

嗨 Tiny,关于 IIS 上始终挂起的问题。是否有任何解决方法可以建议使其在 IIS 上运行?还有你发送的上面的链接。我不需要使用 Azure AD 身份验证。这将在我们的应用程序方面。我们只需要访问令牌来访问图形 api,这就是我们使用 MSAL 的原因。 我也在客户端使用 Angular。 Asp.net 核心是我们的 API。 @AnthonyEarlR.Cuartero 我认为如何解决这个问题取决于目标图 api 支持哪种api permission。如果它支持Permission type: application,那么你可以使用客户端凭证流来访问graph api,因为使用这个流不需要让用户输入用户名和密码,所以它可以在IIS上工作 问题或要求是您希望您的 api 应用程序在 IIS 中工作,因此它确实需要使用客户端凭据流,而不是此处的其他流。当然,您不再需要生成访问令牌,只需使用图形 SDK。 参考我this answer中的代码sn-p。

以上是关于我应该在 MSAL.NET 中使用哪种类型的 ApplicationBuilder?我正在使用 ASP.NET Core Web Api的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 React 中使用哪种类型的组件:功能组件或类基础组件?

如果用户从 msal .net 代码登录,则无法使用 msal.js 静默获取访问令牌

MSAL.NET(权限设置不授予具有 CLSID 的 COM 服务器应用程序的本地激活权限)

我应该使用哪种数据类型在C中存储25位以上的数字?

对于不同大小的输入,我应该使用哪种类型的神经网络?

我应该在CallBimlScript的参数声明中使用哪种数据类型作为字符串值列表?