尝试在AWS Cognito中对用户进行身份验证时发生OperationCanceledException

时间:2019-05-11 07:39:27

标签: c# .net-core amazon-cognito

我正在使用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
 }

我的堆栈跟踪

  

在System.Net.Http.HttpClient.HandleFinishSendAsyncError(异常e,   CancellationTokenSource cts)\ r \ n位于   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位于   Amazon.Runtime.Internal.Util.AsyncHelpers。<> c__DisplayClass1_1 1.<<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任务)   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Internal \ Util \ _mobile \ AsyncHelpers.cs:line   在Amazon.Util.AWSSDKUtils.DownloadStringContent(Uri uri,   TimeSpan超时,IWebProxy代理)   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ AWSSDKUtils.cs:line   Amazon.Util.EC2InstanceMetadata.GetItems(String上的1008 \ r \ n   relativeOrAbsolutePath,Int32尝试,布尔值(slurp)在   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ _bcl + netstandard \ EC2InstanceMetadata.cs:line   513 \ r \ n at   中的Amazon.Util.EC2InstanceMetadata.get_IAMSecurityCredentials()   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Util \ _bcl + netstandard \ EC2InstanceMetadata.cs:line   311 \ r \ n at   Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()   在   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs:line   142 \ r \ n at   Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()   在   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs:line   88 \ r \ n at   Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync()   在   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Credentials \ _bcl + netstandard \ DefaultInstanceProfileAWSCredentials.cs:line   106 \ r \ n at   Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync [T](IExecutionContext   执行上下文)   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Pipeline \ Handlers \ CredentialsRetriever.cs:line   90 \ r \ n   Amazon.Runtime.Internal.RetryHandler.InvokeAsync [T](IExecutionContext   executeContext)\ r \ n位于   Amazon.Runtime.Internal.RetryHandler.InvokeAsync [T](IExecutionContext   执行上下文)   D:\ JenkinsWorkspaces \ trebuchet阶段发布\ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ Pipeline \ RetryHandler \ RetryHandler.cs:line   137 \ r \ n at   Amazon.Runtime.Internal.CallbackHandler.InvokeAsync [T](IExecutionContext   executeContext)\ r \ n位于   Amazon.Runtime.Internal.CallbackHandler.InvokeAsync [T](IExecutionContext   executeContext)\ r \ n位于   Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync [T](IExecutionContext   executeContext)\ r \ n位于   Amazon.Runtime.Internal.MetricsHandler.InvokeAsync [T](IExecutionContext   executeContext)\ r \ n位于   KaiserSmith.MS.Security.AWSCognitoAdapter.UserLogin(String username,   字符串密码)   C:\ Users \ Jason \ Dropbox \ Development \ KaiserSmith.MS \ BundleShared \ Security \ AWSCognitoAdapter.cs:line   83英寸的字符串

3 个答案:

答案 0 :(得分:1)

我设法自己解决了这个问题。我首先开始研究网络错误,弗拉基米尔(Vladimir)在他的回答中指出。我已经排除了本地计算机上的防火墙问题,所以几个小时后我尝试在另一台计算机上遇到了同样的问题。

我尝试了Google搜索类似问题,但都没有运气。 但是经过大量调查,我终于找到了原因,尽管该异常似乎具有误导性。 在我的Google搜索过程中,我遇到了其他示例,这些示例以不同的方式启动客户端,因此我尝试了这种方法并进行了宾果游戏!

所以我改变了这个:

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

成为这个

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

这似乎已经解决了问题!

答案 1 :(得分:0)

让我们遍历堆栈跟踪和相关的源代码:

  

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
  ..

取消 cts(CancellationTokenSource)时抛出的OperationCanceledExceptionHttpClient.Timeout expired or cancelled pending request时, cts 被取消。

assigns the custom value发起请求HttpClient.Timeout的HttpClient。在Amazon.Util.EC2InstanceMetadata.GetItems中,超时设置为 5秒

结论:该请求没有时间执行5秒钟。可能是AWS Cognito暂时出现问题或某些网络延迟问题。

建议:

  • 如果此故障是暂时性的,并且在短暂的延迟后可能会自行纠正,则可以应用Polly.RetryPolicy

  • 尝试研究网络延迟。

答案 2 :(得分:0)

在我的情况下,.NET Cognito客户端抛出了OperationCancelledException或SocketException(主机已关闭)。

因为您没有向AmazonCognitoIdentityProviderClient的构造函数提供任何AWS凭证,所以它试图向http://169.254.169.254发送HTTP请求以获取EC2实例元数据(最终尝试获取EC2实例配置文件或类似的IAM角色)应该假设)。

解决方案是向构造函数提供无效的AWS凭证。 新的AmazonCognitoIdentityProviderClient(新的Amazon.Runtime.BasicAWSCredentials(@“ Invalid”,@“ Credentials”))

套接字异常:当169.254.169.254从我的以太网接口路由出去时,观察到主机关闭,无法获得ARP响应。