1
votes

OperationCanceledException lors de la tentative d'authentification de l'utilisateur dans AWS Cognito

Je joue avec AWS Cognito et j'essaie d'authentifier un utilisateur à partir de mon backend API.

Mais j'obtiens un message "L'opération a été annulée". exception, et je ne sais pas pourquoi!

Voici mon code:

 var authReq = new AdminInitiateAuthRequest()
 {
     UserPoolId = this.UserpoolId,
     ClientId = this.ClientId,
     AuthFlow = AuthFlowType.ADMIN_NO_SRP_AUTH
 };
 authReq.AuthParameters.Add("USERNAME", username);
 authReq.AuthParameters.Add("PASSWORD", password);

 try
 {
     AdminInitiateAuthResponse authResp = await 
     this.SecClient.AdminInitiateAuthAsync(authReq);
 }
 catch(Exception e)
 {
     //The operation was canceled exception
 }

Ma trace de pile

sur System.Net.Http.HttpClient.HandleFinishSendAsyncError (Exception e, CancellationTokenSource cts) \ r \ n à System.Net.Http.HttpClient.FinishSendAsyncUnbuffered (Tâche 1 sendTask, Demande HttpRequestMessage, CancellationTokenSource cts, Boolean disposeCts) \ r \ n à System.Net.Http.HttpClient.GetStringAsyncCore (Task 1 getTask) \ r \ n à Amazon.Runtime.Internal.Util.AsyncHelpers. C__DisplayClass1_1 1. b__0> d.MoveNext () \ r \ n --- Fin de la trace de pile à partir de l'emplacement précédent où l'exception a été lancée --- \ r \ n à Amazon.Runtime.Internal.Util.AsyncHelpers.ExclusiveSynchronizationContext.BeginMessageLoop () dans D: \\ JenkinsWorkspaces \\ trebuchet-stage-release \\ AWSDotNetPublic \\ sdk \\ src \\ Core \\ Amazon.Runtime \\ Internal \\ Util \\ _ mobile \\ AsyncHelpers.cs: ligne 142 \ r \ n à Amazon.Runtime.Internal.Util.AsyncHelpers.RunSync [T] (Func 1 task) dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Internal \ Util \ _mobile \ AsyncHelpers.cs: ligne 87 \ r \ n sur Amazon.Util.AWSSDKUtils.DownloadStringContent (Uri uri, TimeSpan timeout, proxy IWebProxy) dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ AWSSDKUtils.cs: ligne 1008 \ r \ n sur Amazon.Util.EC2InstanceMetadata.GetItems (String relativeOrAbsolutePath, essais Int32, slurp booléen) dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ _bcl + netstandard \ EC2InstanceMetadata.cs: ligne 513 \ r \ n à Amazon.Util.EC2InstanceMetadata.get_IAMSecurityCredentials () dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ _bcl + netstandard \ EC2InstanceMetadata.cs: ligne 311 \ r \ n à Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials () dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs: ligne 142 \ r \ n à Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials () dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs: ligne 88 \ r \ n à Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync () dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs: ligne 106 \ r \ n à Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync [T] (IExecutionContext executionContext) dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Pipeline \ Handlers \ CredentialsRetriever.cs: ligne 90 \ r \ n à Amazon.Runtime.Internal.RetryHandler.InvokeAsync [T] (IExecutionContext executionContext) \ r \ n à Amazon.Runtime.Internal.RetryHandler.InvokeAsync [T] (IExecutionContext executionContext) dans D: \ JenkinsWorkspaces \ trebuchet-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Pipeline \ RetryHandler \ RetryHandler.cs: ligne 137 \ r \ n à Amazon.Runtime.Internal.CallbackHandler.InvokeAsync [T] (IExecutionContext executionContext) \ r \ n à Amazon.Runtime.Internal.CallbackHandler.InvokeAsync [T] (IExecutionContext executionContext) \ r \ n à Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync [T] (IExecutionContext executionContext) \ r \ n à Amazon.Runtime.Internal.MetricsHandler.InvokeAsync [T] (IExecutionContext executionContext) \ r \ n à KaiserSmith.MS.Security.AWSCognitoAdapter.UserLogin (String nom d'utilisateur, String password) dans C: \ Users \ Jason \ Dropbox \ Development \ KaiserSmith.MS \ BundleShared \ Security \ AWSCognitoAdapter.cs: ligne Chaîne de 83 "


0 commentaires

3 Réponses :


0
votes

Traversons la trace de pile et le code source associé:

System.Net.Http.HttpClient.HandleFinishSendAsyncError
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered
..
System.Net.Http.HttpClient.GetStringAsyncCore (tâche)
..
SendAsync
..
AWSSDKUtils. cs: ligne 1008
Amazon.Util.EC2InstanceMetadata.GetItems
..

Le OperationCanceledException lancée lorsque cts (CancellationTokenSource) est annulé. cts est annulé lorsque HttpClient.Timeout a expiré ou annulé la demande en attente .

HttpClient qui a lancé la requête attribue la valeur personnalisée à HttpClient.Timeout . Le délai d'expiration est défini sur 5 secondes dans Amazon.Util.EC2InstanceMetadata.GetItems .

Conclusion: cette requête n'a pas le temps de s'exécuter pendant 5 secondes. Il s'agit probablement d'un problème temporaire avec AWS Cognito ou d'un problème de latence du réseau.

Recommandations:

  • si ce défaut est transitoire et peut s'auto-corriger après un court délai, il est logique d'appliquer Polly.RetryPolicy

  • essayez de rechercher la latence du réseau.


0 commentaires

2
votes

J'ai réussi à résoudre ce problème moi-même. J'ai commencé par me pencher sur l'erreur de réseau, comme l'a souligné Vladimir dans sa réponse. J'avais déjà exclu les problèmes de pare-feu sur ma machine locale, j'ai donc essayé avec une machine différente plusieurs heures plus tard et j'ai eu les mêmes problèmes.

J'ai essayé de rechercher des problèmes similaires sur Google, le tout sans chance. Mais après de nombreuses recherches, j'ai finalement trouvé la cause, bien que l'exception semble être trompeuse. Au cours de ma recherche Google, je suis tombé sur d'autres exemples qui initiaient le client d'une manière différente, alors j'ai essayé ceci et le bingo!

J'ai donc changé ceci:

this.SecClient = new AmazonCognitoIdentityProviderClient(myAwsAccesskey, myAwsSecret,  Amazon.RegionEndpoint.EUCentral1);

Pour devenir ça

this.SecClient = new AmazonCognitoIdentityProviderClient(Amazon.RegionEndpoint.EUCentral1);

Et cela semble avoir résolu le problème!


0 commentaires

0
votes

Dans mon cas, le client .NET Cognito lançait soit une OperationCancelledException, soit une SocketException (l'hôte est en panne).

Comme vous n'avez pas fourni d'informations d'identification AWS au constructeur d'AmazonCognitoIdentityProviderClient, il a tenté d'envoyer une requête HTTP à http: //169.254 .169.254 pour obtenir les métadonnées d'instance EC2 (en essayant finalement d'obtenir le profil d'instance EC2 ou un rôle IAM similaire qu'il devrait assumer).

La solution consiste à fournir des informations d'identification AWS non valides au constructeur. nouveau AmazonCognitoIdentityProviderClient (nouveau Amazon.Runtime.BasicAWSCredentials (@ "Invalid", @ "Credentials"))

Exception de socket: l'hôte est en panne a été observée lorsque 169.254.169.254 a été acheminé vers mon interface Ethernet et aucune réponse ARP n'a pu être obtenue.


0 commentaires