Я играю с AWS Cognito и пытаюсь аутентифицировать пользователя из моего бэкэнда API.
Но получаю "Операция отменена". исключение, и я не знаю, почему!
Вот мой код:
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
}
Моя трассировка стека
at System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts)\r\n at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task
1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\r\n at System.Net.Http.HttpClient.GetStringAsyncCore(Task
1 getTask)\r\n at Amazon.Runtime.Internal.Util.AsyncHelpers.<>c__DisplayClass1_11.<<RunSync>b__0>d.MoveNext()\r\n --- End of stack trace from previous location where exception was thrown ---\r\n at Amazon.Runtime.Internal.Util.AsyncHelpers.ExclusiveSynchronizationContext.BeginMessageLoop() in D:\\JenkinsWorkspaces\\trebuchet-stage-release\\AWSDotNetPublic\\sdk\\src\\Core\\Amazon.Runtime\\Internal\\Util\\_mobile\\AsyncHelpers.cs:line 142\r\n at Amazon.Runtime.Internal.Util.AsyncHelpers.RunSync[T](Func
1 task) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\_mobile\AsyncHelpers.cs:line 87\r\n at Amazon.Util.AWSSDKUtils.DownloadStringContent(Uri uri, TimeSpan timeout, IWebProxy proxy) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Util\AWSSDKUtils.cs:line 1008\r\n at Amazon.Util.EC2InstanceMetadata.GetItems(String relativeOrAbsolutePath, Int32 tries, Boolean slurp) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Util\_bcl+netstandard\EC2InstanceMetadata.cs:line 513\r\n at Amazon.Util.EC2InstanceMetadata.get_IAMSecurityCredentials() in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Util\_bcl+netstandard\EC2InstanceMetadata.cs:line 311\r\n at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials() in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Credentials\_bcl+netstandard\DefaultInstanceProfileAWSCredentials.cs:line 142\r\n at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials() in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Credentials\_bcl+netstandard\DefaultInstanceProfileAWSCredentials.cs:line 88\r\n at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync() in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Credentials\_bcl+netstandard\DefaultInstanceProfileAWSCredentials.cs:line 106\r\n at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\Handlers\CredentialsRetriever.cs:line 90\r\n at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)\r\n at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\RetryHandler\RetryHandler.cs:line 137\r\n at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)\r\n at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)\r\n at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)\r\n at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)\r\n at KaiserSmith.MS.Security.AWSCognitoAdapter.UserLogin(String username, String password) in C:\Users\Jason\Dropbox\Development\KaiserSmith.MS\BundleShared\Security\AWSCognitoAdapter.cs:line 83" string
Давайте пройдемся по трассировке стека и соответствующему исходному коду:
System.Net.Http.HttpClient.HandleFinishSendAsyncError
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered
..
System.Net.Http.HttpClient.GetStringAsyncCore(Task)
..
SendAsync
..
AWSSDKUtils.cs:line 1008
Amazon.Util.EC2InstanceMetadata.GetItems
..
OperationCanceledException выдается при отмене cts (CancellationTokenSource). кт отменяется, когда HttpClient.Timeout истек или отменен ожидающий запрос.
HttpClient, инициировавший запрос с присваивает пользовательское значение на HttpClient.Timeout. Время ожидания установлено на 5 секунд в Amazon.Util.EC2InstanceMetadata.GetItems.
Вывод: этот запрос не успевает выполниться за 5 секунд. Возможно, это временная проблема с AWS Cognito или с задержкой в сети.
Рекомендации:
если эта ошибка является временной и может самокорректироваться после небольшой задержки, имеет смысл применить Polly.RetryPolicy
попробуйте исследовать задержку сети.
Мне удалось решить это самостоятельно. Сначала я начал изучать сетевую ошибку, как указал Владимир в своем ответе. Я уже исключил проблемы с брандмауэром на своем локальном компьютере, поэтому через несколько часов попробовал с другого компьютера и столкнулся с теми же проблемами.
Я пробовал искать похожие проблемы в Google, но все безуспешно. Но после долгих исследований я в конце концов нашел причину, хотя исключение, похоже, вводит в заблуждение. Во время моего поиска в Google я наткнулся на другие примеры, которые инициировали клиент другим способом, поэтому я попробовал это и бинго!
Итак, я изменил это:
this.SecClient = new AmazonCognitoIdentityProviderClient(Amazon.RegionEndpoint.EUCentral1);
Чтобы стать этим
this.SecClient = new AmazonCognitoIdentityProviderClient(myAwsAccesskey, myAwsSecret, Amazon.RegionEndpoint.EUCentral1);
И это, кажется, решило проблему!
В моем случае клиент .NET Cognito выдавал исключение OperationCancelledException или SocketException (хост не работает).
Поскольку вы не предоставили какие-либо учетные данные AWS конструктору AmazonCognitoIdentityProviderClient, он попытался отправить HTTP-запрос к http://169.254.169.254 для получения метаданных экземпляра EC2 (в конечном итоге пытаясь получить профиль экземпляра EC2 или аналогичную роль IAM, которую он должен принять).
Решение состоит в том, чтобы предоставить конструктору недопустимые учетные данные AWS. новый AmazonCognitoIdentityProviderClient(новый Amazon.Runtime.BasicAWSCredentials(@"Invalid", @"Credentials"))
Исключение сокета: хост не работает, когда 169.254.169.254 был направлен из моего интерфейса Ethernet, и не удалось получить ответ ARP.