Azure Identity ClientSecretCredential 抛出“找不到方法”错误 dotnet SDK 版本 1.10.4

问题描述 投票:0回答:1

我正在使用 Azure Identity 客户端 SDK dotnet 1.10.4 和 clientsecretcredential 类来生成要从我的 blob 中读取的令牌。我在此链接中关注了容器示例中的列表 blob

https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-list

我收到以下错误

Azure.Identity.AuthenticationFailedException:ClientSecretCredential 身份验证失败:找不到方法:'Void System.Text.Json.Serialization.Metadata.JsonObjectInfoValues

1.set_ObjectCreator(System.Func
1)'。 ---> System.MissingMethodException:找不到方法:'Void System.Text.Json.Serialization.Metadata.JsonObjectInfoValues
1.set_ObjectCreator(System.Func
1)'。 在 Microsoft.Identity.Client.Platforms.net6.MsalJsonSerializerContext.get_InstanceDiscoveryResponse() 在 Microsoft.Identity.Client.Platforms.net6.MsalJsonSerializerContext.GetTypeInfo(类型类型) 在 System.Text.Json.JsonSerializer.GetTypeInfo(JsonSerializerContext 上下文,类型 inputType) 在 System.Text.Json.JsonSerializer.Deserialize(字符串 json,类型 returnType,JsonSerializerContext 上下文) 在 Microsoft.Identity.Client.Utils.JsonHelper.DeserializeFromJson[T](字符串 json) 在 Microsoft.Identity.Client.OAuth2.OAuth2Client.CreateResponse[T](HttpResponse 响应,RequestContext requestContext) 在 Microsoft.Identity.Client.OAuth2.OAuth2Client.ExecuteRequestAsync[T](Uri endPoint、HttpMethod 方法、RequestContext requestContext、布尔值 ExpectErrorsOn200OK、布尔值 addCommonHeaders、Func
2 onBeforePostRequestData) at Microsoft.Identity.Client.OAuth2.OAuth2Client.DiscoverAadInstanceAsync(Uri endpoint, RequestContext requestContext) at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.SendInstanceDiscoveryRequestAsync(Uri authority, RequestContext requestContext) at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.FetchAllDiscoveryMetadataAsync(Uri authority, RequestContext requestContext) at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.GetMetadataAsync(Uri authority, RequestContext requestContext) at Microsoft.Identity.Client.Instance.Discovery.InstanceDiscoveryManager.FetchNetworkMetadataOrFallbackAsync(RequestContext requestContext, Uri authorityUri) at Microsoft.Identity.Client.Instance.Discovery.InstanceDiscoveryManager.GetMetadataEntryAsync(AuthorityInfo authorityInfo, RequestContext requestContext, Boolean forceValidation) at Microsoft.Identity.Client.Instance.AuthorityManager.RunInstanceDiscoveryAndValidationAsync() at Microsoft.Identity.Client.Internal.Requests.ClientCredentialRequest.GetAccessTokenAsync(CancellationToken cancellationToken, ILoggerAdapter logger) at Microsoft.Identity.Client.Internal.Requests.ClientCredentialRequest.ExecuteAsync(CancellationToken cancellationToken) at Microsoft.Identity.Client.Internal.Requests.RequestBase.RunAsync(CancellationToken cancellationToken) at Microsoft.Identity.Client.ApiConfig.Executors.ConfidentialClientExecutor.ExecuteAsync(AcquireTokenCommonParameters commonParameters, AcquireTokenForClientParameters clientParameters, CancellationToken cancellationToken) at Azure.Identity.AbstractAcquireTokenParameterBuilderExtensions.ExecuteAsync[T](AbstractAcquireTokenParameterBuilder
1 生成器、布尔值异步、CancellationToken CancellationToken) 在Azure.Identity.MsalConfidentialClient.AcquireTokenForClientCoreAsync(字符串[]范围,字符串tenantId,布尔enableCae,布尔异步,CancellationToken取消令牌) 在Azure.Identity.MsalConfidentialClient.AcquireTokenForClientAsync(字符串[]范围,字符串tenantId,布尔enableCae,布尔异步,CancellationToken取消令牌) 在Azure.Identity.ClientSecretCredential.GetTokenAsync(TokenRequestContext requestContext,CancellationToken CancellationToken) --- 内部异常堆栈跟踪结束 --- 在Azure.Identity.CredentialDiagnosticScope.FailWrapAndThrow(异常前,字符串additionalMessage,布尔值isCredentialUnavailable) 在Azure.Identity.ClientSecretCredential.GetTokenAsync(TokenRequestContext requestContext,CancellationToken CancellationToken) 在Azure.Core.Pipeline.BearerTokenAuthenticationPolicy.AccessTokenCache.GetHeaderValueFromCredentialAsync(TokenRequestContext上下文,布尔异步,CancellationToken CancellationToken) 在Azure.Core.Pipeline.BearerTokenAuthenticationPolicy.AccessTokenCache.GetHeaderValueAsync(HttpMessage消息,TokenRequestContext上下文,布尔异步) 在Azure.Core.Pipeline.BearerTokenAuthenticationPolicy.AccessTokenCache.GetHeaderValueAsync(HttpMessage消息,TokenRequestContext上下文,布尔异步) 在Azure.Core.Pipeline.BearerTokenAuthenticationPolicy.AuthenticateAndAuthorizeRequestAsync(HttpMessage消息,TokenRequestContext上下文) 在Azure.Storage.StorageBearerTokenChallengeAuthorizationPolicy.AuthorizeRequestInternal(HttpMessage消息,布尔异步) 在Azure.Core.Pipeline.BearerTokenAuthenticationPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory
1 pipeline, Boolean async) at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.InnerProcessAsync(HttpMessage message, ReadOnlyMemory
1管道) 在Azure.Core.Pipeline.RedirectPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory
1 pipeline, Boolean async) at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory
1管道,布尔异步) 在Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory
1 pipeline, Boolean async) at Azure.Storage.Blobs.ContainerRestClient.ListBlobFlatSegmentAsync(String prefix, String marker, Nullable
1最大结果,IEnumerable
1 include, Nullable
1超时,CancellationToken取消令牌) 在Azure.Storage.Blobs.BlobContainerClient.GetBlobsInternal(字符串标记,BlobTraits特征,BlobStates状态,字符串前缀,Nullable
1 pageSizeHint, Boolean async, CancellationToken cancellationToken) at Azure.Storage.Blobs.Models.GetBlobsAsyncCollection.GetNextPageAsync(String continuationToken, Nullable
1 pageSizeHint,布尔异步,CancellationToken取消令牌) 在 Azure.Storage.StorageCollectionEnumerator
1.StorageAsyncPageable.AsPages(String continuationToken, Nullable
1 页HintSize)+MoveNext() 在 Azure.Storage.StorageCollectionEnumerator
1.StorageAsyncPageable.AsPages(String continuationToken, Nullable
1 pageHintSize)+System.Threading.Tasks.Sources.IValueTaskSource.GetResult()

下面是我的代码

'''

     var tenantId = tenantid;
     var clientId = ClientId;
     var clientSecret = clientSecret;
     var credential = new Azure.Identity.ClientSecretCredential(
        tenantId,
        clientId,
        clientSecret,
        new TokenCredentialOptions
        {
            AuthorityHost = new Uri("https://login.microsoftonline.com")
        });



    Console.WriteLine($"credential object {credential}");

   var  blobServiceClient = new 
    BlobServiceClient(new Uri($"https://<storageaccountname>.blob.core.windows.net"),credential)
    ;
   


    Console.WriteLine(blobServiceClient);

    //Console.WriteLine(blobcontainerClient);

var blobcontainerClient = blobServiceClient.GetBlobContainerClient("containername");

Console.WriteLine(blobcontainerClient);

int? segmentSize = null;



   // Call the listing operation and return pages of the specified size.
    var resultSegment = blobcontainerClient.GetBlobsAsync()
        .AsPages(default, segmentSize);

    // Enumerate the blobs returned for each page.

    try
    {
    ***await foreach (Azure.Page<BlobItem> blobPage in resultSegment)***
    {
        foreach (BlobItem blobItem in blobPage.Values)
        {
            Console.WriteLine("Blob name: {0}", blobItem.Name);
        }

        Console.WriteLine("all complete");
    }
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex);
    }

'''

我在await foreach 行遇到异常。这与 learn.microsoft 链接示例中的同一行。

非常感谢任何指示和帮助。

c# .net azure azure-active-directory azure-blob-storage
1个回答
0
投票

Azure.Identity.AuthenticationFailedException:ClientSecretCredential 身份验证失败:找不到方法:'Void System.Text.Json.Serialization.Metadata.JsonObjectInfoValues

1.set_ObjectCreator(System.Func
1)'。 ---> System.MissingMethodException:

该错误可能是由于 blob 包和身份包之间的身份验证依赖关系不正确或不匹配造成的。

在我的环境中,我都更新了各自版本的软件包。

版本:

<ItemGroup>
  <PackageReference Include="Azure.Identity" Version="1.10.4" />
  <PackageReference Include="Azure.Storage.Blobs" Version="12.19.1" />
</ItemGroup>

现在,使用更新版本,我可以使用

ClientSecretCredential
身份验证列出 blob。

代码:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

public class Program
{
    public static async Task Main(string[] args)
    {
        var tenantId = "<Your tenant -id>";
        var clientId = "<Your client -d>";
        var clientSecret = "xxxxx";
        var options = new TokenCredentialOptions
        {
            AuthorityHost = new Uri("https://login.microsoftonline.com")
        };
        var credential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
        
        Console.WriteLine($"credential object {credential}");

        var blobServiceClient = new
         BlobServiceClient(new Uri($"https://<storageaccountname>.blob.core.windows.net"), credential)
         ;
        Console.WriteLine(blobServiceClient);
        var blobcontainerClient = blobServiceClient.GetBlobContainerClient("test");
        Console.WriteLine(blobcontainerClient);
        int? segmentSize = null;
        var resultSegment = blobcontainerClient.GetBlobsAsync()
            .AsPages(default, segmentSize);
        try
        {
            await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
            {
                foreach (BlobItem blobItem in blobPage.Values)
                {
                    Console.WriteLine("Blob name: {0}", blobItem.Name);
                }

                Console.WriteLine("all complete");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}

输出:

credential object Azure.Identity.ClientSecretCredential
Azure.Storage.Blobs.BlobServiceClient
Azure.Storage.Blobs.BlobContainerClient
Blob name: jgs.html
Blob name: sample.pdf
Blob name: sample.txt
Blob name: temp.png
all complete

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.