我正在使用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_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任务) 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英寸的字符串
答案 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)时抛出的OperationCanceledException。 HttpClient.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响应。