我正在使用 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.JsonObjectInfoValues1.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、Func2 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消息,ReadOnlyMemory1 pipeline, Boolean async) at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.InnerProcessAsync(HttpMessage message, ReadOnlyMemory
1管道)
在Azure.Core.Pipeline.RedirectPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory1 pipeline, Boolean async) at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory
1管道,布尔异步)
在Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory1 pipeline, Boolean async) at Azure.Storage.Blobs.ContainerRestClient.ListBlobFlatSegmentAsync(String prefix, String marker, Nullable
1最大结果,IEnumerable1 include, Nullable
1超时,CancellationToken取消令牌)
在Azure.Storage.Blobs.BlobContainerClient.GetBlobsInternal(字符串标记,BlobTraits特征,BlobStates状态,字符串前缀,Nullable1 pageSizeHint, Boolean async, CancellationToken cancellationToken) at Azure.Storage.Blobs.Models.GetBlobsAsyncCollection.GetNextPageAsync(String continuationToken, Nullable
1 pageSizeHint,布尔异步,CancellationToken取消令牌)
在 Azure.Storage.StorageCollectionEnumerator1.StorageAsyncPageable.AsPages(String continuationToken, Nullable
1 页HintSize)+MoveNext()
在 Azure.Storage.StorageCollectionEnumerator1.StorageAsyncPageable.AsPages(String continuationToken, Nullable
1 pageHintSize)+System.Threading.Tasks.Sources.IValueTaskSource下面是我的代码
'''
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 链接示例中的同一行。
非常感谢任何指示和帮助。
Azure.Identity.AuthenticationFailedException:ClientSecretCredential 身份验证失败:找不到方法:'Void System.Text.Json.Serialization.Metadata.JsonObjectInfoValues
1)'。 ---> System.MissingMethodException:1.set_ObjectCreator(System.Func
该错误可能是由于 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