【问题标题】:MSAL / MS Graph code works in .Net Core 3.1 but not .Net Framework 4.8MSAL / MS Graph 代码适用于 .Net Core 3.1,但不适用于 .Net Framework 4.8
【发布时间】: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


【解决方案1】:

代码没有问题。我在我身边测试它以按 msal 列出用户。当代码使用 .net core 3.1 运行时,它可以在Console.WriteLine(...) 行中打印结果。但是如果代码使用 .net framework 4.8 运行,它会像你提到的那样退出应用程序。

实际上,当它在 .net framework 4.8 中运行时,它也会打印结果。我们可以添加一行代码Console.ReadLine();,然后就可以在控制台看到结果了。

以下是我的代码供您参考:

using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;
using System;

namespace ConsoleApp8
{
    class Program
    {
        static async System.Threading.Tasks.Task Main(string[] args)
        {
            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
            .Create("clientId")
            .WithTenantId("tenantId")
            .WithClientSecret("clientSecret")
            .Build();

            ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            var users = await graphClient.Users
            .Request()
            .GetAsync();

            Console.WriteLine(users.Count);
            
            Console.ReadLine(); //add this line, then the console window will not exit
        }
    }
}

另一种方式,如果您不想添加行Console.ReadLine();。您可以使用“Ctrl + F5”而不是单击“开始”按钮来运行您的代码,它也会显示控制台结果。

=============================更新=========== =================

  <package id="Microsoft.Graph" version="3.27.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" />
  <package id="Microsoft.Identity.Client" version="4.27.0" targetFramework="net48" />

【讨论】:

  • 我希望我的问题更清楚,表明代码在 graphClient.Users.Request().GetAsync() 处崩溃。它永远不会到达下一行,在您的情况下是 Console.WriteLine 或在我的结果枚举中。这是崩溃的问题。您的代码适合您。差异“可能”是 nuget 包的版本。我已将我目前拥有的版本添加到问题中,您能否与您的版本进行比较,让我知道您正在使用哪些版本?
  • 嗨@briask 很抱歉误解了你的问题。我使用您刚才在我身边提供的相同代码进行测试,它工作正常。我已经用我的项目中的 nuget 包更新了我的答案。
  • @briask 顺便说一句,你怎么知道代码刚刚到达graphClient.Users.Request().GetAsync() 行但没有执行下一行?在我的测试中,如果我们在.net框架中运行代码,它会运行成功,但不会长时间保持控制台窗口。所以我建议你在我原来的答案中添加Console.ReadLine();这一行。
  • @briask Here 是我的代码(除了最后一行外几乎与您的相同)供您参考。它工作正常。
  • @briask 很抱歉,您能否尝试添加行 Console.ReadLine(); 或按“Ctrl + F5”运行您的代码。因为您的代码和 nuget 包看起来是正确的,所以我猜代码在您这边可以正常工作。问题是控制台窗口没有保留。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2020-05-05
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多