繁体   English   中英

MSAL System.InvalidOperationException:CompactToken 解析失败,错误代码:80049217

[英]MSAL System.InvalidOperationException: CompactToken parsing failed with error code: 80049217

我正在为 .NET 使用 MSAL 来为我的 Graph API 请求获取令牌,但是突然之间,我遇到了以下错误,我可以看到很多关于该错误的帖子,但没有解决错误 80049217 发生的原因? 有谁知道为什么会发生此错误以及避免该错误的解决方案?

System.InvalidOperationException:CompactToken 解析失败,错误代码:80049217

更新 22-01-10 获取访问令牌的方法示例(客户端是使用包含此方法的工厂 class 的所有线程重用的 HttpClient 实例。_confidentialClient 是 MSAL .NET 库中的 IConfidentialClientApplication 的实例):

// Multiple threads will access this method
private async Task GetAccessToken()
{
    try
    {
        Console.WriteLine("Acquire token....");
        // Is the .AcquireTokenForClient method thread safe??
        var result = await _confidentialClient.AcquireTokenForClient("https://graph.microsoft.com/.default").ExecuteAsync();
        if(Client.DefaultRequestHeaders.Authorization?.Parameter == result.AccessToken)
        {
            Console.WriteLine("Token havn't changed.");
            return;
        }
        Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
        Console.WriteLine("Acquire token successfully!");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

由这个工厂 class 与 Graph API 交互的所有线程将首先调用 GetAccessToken 方法,以确保 HttpClient 在授权 header 中具有有效的 AccessToken。 据我了解 IConfidentialClientApplication,AcquireTokenForClient() 将在内部缓存中查找有效令牌,如果没有,则获取一个新令牌,这就是该方法总是被任何线程调用的原因。

您似乎在 asp.net 核心后端项目中编写了此代码,并且您想要一种方法来帮助生成不同范围的访问令牌,而无需输入用户名/密码进行登录,以便它可以服务于不同的场景。 但是你在这里犯了一个错误。

先看这个文档 在服务器/守护程序应用程序中,您只能使用客户端凭据流来生成访问令牌, 因此图 api 的 scope 应该是https://graph.microsoft.com/.default 。 asp.net 核心应用程序中的凭证流。 这是片段。

var scopes = new[] { "https://graph.microsoft.com/.default" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://docs.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM