亚马逊 CognitoAuthentication 扩展库示例 - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊 CognitoAuthentication 扩展库示例

注意

本主题中的信息特定于基于 .NET 框架和Amazon SDK for .NET版本 3.3 及更早版本。

这些区域有: CognitoAuthentication 扩展库,可在亚马逊扩展。Cognito 身份验证 NuGet 软件包简化了适用于 .NET Core 的 Amazon Cognito 用户池和 Xamarin 开发人员的身份验证流程。该库基于 Amazon Cognito Identity 提供商 API 构建,可创建和发送用户身份验证 API 调用。

使用 CognitoAuthentication 扩展库

Amazon Cognito 有一些内置AuthFlowChallengeName用于通过安全远程密码 (SRP) 验证用户名和密码的标准身份验证流程的值。有关身份验证流程的更多信息,请参阅 Amazon Cognito 用户池身份验证流程

以下示例需要这些 using 语句:

// Required for all examples using System; using Amazon; using Amazon.CognitoIdentity; using Amazon.CognitoIdentityProvider; using Amazon.Extensions.CognitoAuthentication; using Amazon.Runtime; // Required for the GetS3BucketsAsync example using Amazon.S3; using Amazon.S3.Model;

使用基本验证

创建AmazonCognitoIdentityProviderClient使用AnonymousAWSCredentials,这不需要已签名请求。您无需提供一个区域,如果未提供区域,底层代码将调用 FallbackRegionFactory.GetRegionEndpoint()。创建 CognitoUserPoolCognitoUser 对象。使用包含用户密码的 StartWithSrpAuthAsync 调用 InitiateSrpAuthRequest 方法。

public static async void GetCredsAsync() { AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials()); CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider); CognitoUser user = new CognitoUser("username", "clientID", userPool, provider); InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest() { Password = "userPassword" }; AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false); accessToken = authResponse.AuthenticationResult.AccessToken; }

用质询进行身份

继续面临挑战的身份验证流程,例如 NewPasswordRequired 和 Multi-Factor Authentication (MFA) 也更简单。唯一的要求是 CognitoAuthentication 对象、用户的 SRP 密码以及进行下一个质询所需的信息,这是在提示用户进行输入时获取的。以下代码显示了一种检查质询类型并获取针对 MFA 的适当响应和方法。 NewPasswordRequired 身份验证流程中的挑战。

像之前一样执行基本身份验证请求,并且 await 一个 AuthFlowResponse。当收到响应时,循环访问返回的 AuthenticationResult 对象。如果 ChallengeName 类型为 NEW_PASSWORD_REQUIRED,请调用 RespondToNewPasswordRequiredAsync 方法。

public static async void GetCredsChallengesAsync() { AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials()); CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider); CognitoUser user = new CognitoUser("username", "clientID", userPool, provider); InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest(){ Password = "userPassword" }; AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false); while (authResponse.AuthenticationResult == null) { if (authResponse.ChallengeName == ChallengeNameType.NEW_PASSWORD_REQUIRED) { Console.WriteLine("Enter your desired new password:"); string newPassword = Console.ReadLine(); authResponse = await user.RespondToNewPasswordRequiredAsync(new RespondToNewPasswordRequiredRequest() { SessionID = authResponse.SessionID, NewPassword = newPassword }); accessToken = authResponse.AuthenticationResult.AccessToken; } else if (authResponse.ChallengeName == ChallengeNameType.SMS_MFA) { Console.WriteLine("Enter the MFA Code sent to your device:"); string mfaCode = Console.ReadLine(); AuthFlowResponse mfaResponse = await user.RespondToSmsMfaAuthAsync(new RespondToSmsMfaRequest() { SessionID = authResponse.SessionID, MfaCode = mfaCode }).ConfigureAwait(false); accessToken = authResponse.AuthenticationResult.AccessToken; } else { Console.WriteLine("Unrecognized authentication challenge."); accessToken = ""; break; } } if (authResponse.AuthenticationResult != null) { Console.WriteLine("User successfully authenticated."); } else { Console.WriteLine("Error in authentication process."); } }

使用Amazon验证后的资源

一旦用户通过使用 CognitoAuthentication 库,下一步是允许用户访问适当的Amazon资源的费用。为此,您必须通过 Amazon Cognito 联合身份控制台创建一个身份池。通过将您创建的 Amazon Cognito 用户池指定为提供商并使用其 poolID 和 clientID,您可以允许您的 Amazon Cognito 用户池用户访问您的 Amazon Cognito 用户池用户。Amazon已连接到帐户的资源。您还可以指定不同的角色来支持未经身份验证的和已经过身份验证的用户访问不同的资源。您可以在 IAM 控制台中更改这些规则,其中,您可以在角色的附加策略的操作字段中添加或删除权限。然后,使用合适的身份池、用户池和 Amazon Cognito 用户信息,您可以拨打不同的呼叫。Amazon资源的费用。以下示例显示了使用用于访问关联的身份池角色允许的不同 Amazon S3 存储桶的 SRP 进行用户身份验证

public async void GetS3BucketsAsync() { var provider = new AmazonCognitoIdentityProviderClient(new AnonymousAWSCredentials()); CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider); CognitoUser user = new CognitoUser("username", "clientID", userPool, provider); string password = "userPassword"; AuthFlowResponse context = await user.StartWithSrpAuthAsync(new InitiateSrpAuthRequest() { Password = password }).ConfigureAwait(false); CognitoAWSCredentials credentials = user.GetCognitoAWSCredentials("identityPoolID", RegionEndpoint.< YourIdentityPoolRegion >); using (var client = new AmazonS3Client(credentials)) { ListBucketsResponse response = await client.ListBucketsAsync(new ListBucketsRequest()).ConfigureAwait(false); foreach (S3Bucket bucket in response.Buckets) { Console.WriteLine(bucket.BucketName); } } }

更多验证选项

除了 SRP、NewPasswordRequired 和 MFA 以外, CognitoAuthentication 扩展库为以下内容提供了针对以下内容的

  • 自定义- 通过调用 StartWithCustomAuthAsync(InitiateCustomAuthRequest customRequest) 启动

  • RefreshToken - 通过调用 StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest) 启动

  • RefreshTokenSRP - 通过调用 StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest) 启动

  • AdminNoSRP - 通过调用 StartWithAdminNoSrpAuthAsync(InitiateAdminNoSrpAuthRequest adminAuthRequest) 启动

根据您想要的流程调用相应的方法。然后,当质询显示在每个方法调用的 AuthFlowResponse 对象中时继续提示用户进行质询。此外,调用相应的响应方法,如适用于 MFA 质询的 RespondToSmsMfaAuthAsync 和适用于自定义质询的 RespondToCustomAuthAsync