【发布时间】:2021-03-10 20:20:08
【问题描述】:
拥有一个使用客户端凭据流在 Azure ADB2C 中管理用户的应用程序。应用程序是用 .Net Framework 编写的,并且一直使用 ADAL 与 ADB2C 进行通信。目前希望将应用从 ADAL 迁移到 MSAL,但遇到了如下问题。
如果我创建一个简单的 .Net Core 3.1 示例应用程序并使用下面的代码,那么该应用程序将连接到 ADB2C 并列出用户。
如果我在示例 .Net Framework 4.8 控制台应用程序中使用相同的代码,则代码将在尝试执行 "await graphClient.Users.Request() 时无异常、无错误等退出应用程序" 命令。没有任何问题的迹象,但它只是退出...... 它永远不会到达下一行来枚举结果。如果我调试并逐步执行,同样的事情会发生,程序在该行崩溃,没有错误/异常。
更新::这似乎是它运行的公司环境中的一个问题。如果我使用相同的代码并在我的个人笔记本电脑上针对个人 Azure 资源运行它,它适用于 .Net Framework 和 .Net Core 版本。
现在的问题是 .net 框架版本与 .net 核心版本发出的请求有什么不同。使用 Fiddler 可以看到代码发出 CONNECT login.microsoftonline.com:443,对于 .net 框架版本,会话被中止,而 .net 核心调用继续与 ADB2C 资源等进行通信。
有什么想法吗?
目前无法将应用程序迁移到 .Net Core,因此需要让 .Net Framework 应用程序与 MSAL 一起使用。
看不出问题出在哪里,代码大概应该可以工作,但在 .Net Framework 中却不行。
关于可能导致此问题的任何想法?
using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;
var clientId = "app client id";
var clientSecret = "app secret";
var tenantId = "myownb2cdomain.onmicrosoft.com";
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantId)
.WithClientSecret(clientSecret)
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
var result = await graphClient.Users // Program crashes here with no exception or error given
.Request()
.Select(e => new
{
e.DisplayName,
e.Id,
e.Identities
})
.GetAsync();
foreach (var user in result.CurrentPage)
{
Console.WriteLine(JsonConvert.SerializeObject(user));
}
当前 Nuget 包版本如下
<package id="Microsoft.Graph" version="3.26.0" targetFramework="net48" />
<package id="Microsoft.Graph.Auth" version="1.0.0-preview.6" targetFramework="net48" />
<package id="Microsoft.Graph.Core" version="1.24.0" targetFramework="net48" />
【问题讨论】:
-
我在使用 .net 框架时遇到了同样的问题。你能解决这个问题吗?
-
@winterishere 不幸的是,当我使用相同的代码、相同的包引用等创建一个新的解决方案/项目时,这个问题就“消失了”。它在新项目中有效,但在旧项目中无效......不知道为什么
标签: azure-ad-b2c msal