使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

Att*_*osa 7 c# amazon-web-services amazon-cognito .net-core

如何使用 C# 和 .NET Core 3.x 管理 AWS Cognito 用户池中的用户?在文档中找不到有关它的任何内容。

SOR*_*der 16

@Attilio Gelosa 的原创文章

我写这篇文章是希望对其他人有帮助。我必须阅读一页又一页的文档,并从 AWS 专家那里获得帮助(非常感谢 Faustino!),但最终我做到了:能够使用 C# 和 . NET 核心 3.x。

配置

在开始之前,我们必须:

  • 在后台做一些配置。
  • 在本地计算机上创建凭据文件。

登录 AWS 管理控制台

请转至 AWS 管理控制台并使用您要使用的管理帐户登录。

创建具有编程访问权限的新用户

转至 AWS Identity and Access Management (IAM),单击“用户”链接,然后单击“添加用户”按钮。

在此输入图像描述

输入您要使用的用户名,打开编程访问标志,然后单击下一步:权限按钮。

在此输入图像描述

单击直接附加现有策略,使用“Cognito”过滤策略,然后单击该标志以激活AmazonCognitoPowerUser

在此输入图像描述

单击“下一步”到达最后一个选项卡并创建用户。在下一页上,您将收到创建确认信息。请记下访问密钥 ID值和秘密访问密钥值,或者您可以下载包含相同信息的 CSV 文件。

在此输入图像描述

编辑本地凭据文件

要编辑本地凭据文件,请转到%USERPROFILE%\.aws\credentials如果您使用的是 Windows 还是 Linux ~/.aws/credentials。该文件应该是这样的:

[Profile_name_1]
aws_access_key_id=<ACCESS_KEY_ID_1>
aws_secret_access_key=<SECRET_ACCESS_KEY_1>

[Profile_name_2]
aws_access_key_id=<ACCESS_KEY_ID_2>
aws_secret_access_key=<SECRET_ACCESS_KEY_2>
Run Code Online (Sandbox Code Playgroud)

使用您想要的名称创建一个新部分,然后复制您之前记下的访问密钥 ID 和秘密访问密钥。请记下您选择的部分名称。

创建用户池

转到 Cognito 用户池页面并创建一个新池。输入您要使用的名称,然后单击“查看默认值”在此输入图像描述

在下一页上,单击“添加应用程序客户端...”链接。

在此输入图像描述

单击添加应用程序客户端

在此输入图像描述

在下一页上,插入您要使用的应用程序的名称。确保打开以下标志:

  • 为管理 API 启用用户名密码身份验证以进行身份​​验证 (ALLOW_ADMIN_USER_PASSWORD_AUTH)。
  • 启用基于 SRP(安全远程密码)协议的身份验证 (ALLOW_USER_SRP_AUTH)。
  • 启用基于刷新令牌的身份验证 (ALLOW_REFRESH_TOKEN_AUTH)。

请注意禁用“生成客户端密钥”标志。

在此输入图像描述

最后,单击“创建应用程序客户端”按钮。

在此输入图像描述

现在返回池详细信息,单击“返回池详细信息”链接。

在此输入图像描述

现在创建新池,单击“创建池”按钮。

在此输入图像描述

请记下应用程序客户端设置菜单下的池 ID应用程序客户端 ID

在此输入图像描述

在此输入图像描述

创建群组

转到“用户和组”,单击“组”选项卡,然后单击“创建组”按钮。

在此输入图像描述

输入新组的名称,然后单击“创建组”按钮。

在此输入图像描述

代码

下面的库代码仅用于演示目的。在投入生产之前,有必要添加更好的异常处理系统和日志记录。

请记住添加以下库:

  • Amazon.Extensions.CognitoAuthentication
  • AWSSDK.Extensions.NETCore.Setup
public class CognitoUserManagement
{
    private readonly AWSCredentials awsCredentials;
    private readonly AmazonCognitoIdentityProviderClient adminAmazonCognitoIdentityProviderClient;
    private readonly AmazonCognitoIdentityProviderClient anonymousAmazonCognitoIdentityProviderClient;

    public CognitoUserManagement(string profileName, RegionEndpoint regionEndpoint)
    {
        CredentialProfileStoreChain credentialProfileStoreChain = new CredentialProfileStoreChain();

        if (credentialProfileStoreChain.TryGetAWSCredentials(profileName, out AWSCredentials internalAwsCredentials))
        {
            awsCredentials = internalAwsCredentials;
            adminAmazonCognitoIdentityProviderClient = new AmazonCognitoIdentityProviderClient(
                awsCredentials,
                regionEndpoint);
            anonymousAmazonCognitoIdentityProviderClient = new AmazonCognitoIdentityProviderClient(
                new AnonymousAWSCredentials(),
                regionEndpoint);
        }
        else
        {
            throw new ArgumentNullException(nameof(AWSCredentials));
        }
    }

    public async Task AdminCreateUserAsync(
        string username,
        string password,
        string userPoolId,
        string appClientId,
        List<AttributeType> attributeTypes)
    {
        AdminCreateUserRequest adminCreateUserRequest = new AdminCreateUserRequest
        {
            Username = username,
            TemporaryPassword = password,
            UserPoolId = userPoolId,
            UserAttributes = attributeTypes
        };
        AdminCreateUserResponse adminCreateUserResponse = await adminAmazonCognitoIdentityProviderClient
            .AdminCreateUserAsync(adminCreateUserRequest)
            .ConfigureAwait(false);

        AdminUpdateUserAttributesRequest adminUpdateUserAttributesRequest = new AdminUpdateUserAttributesRequest
        {
            Username = username,
            UserPoolId = userPoolId,
            UserAttributes = new List<AttributeType>
                    {
                        new AttributeType()
                        {
                            Name = "email_verified",
                            Value = "true"
                        }
                    }
        };

        AdminUpdateUserAttributesResponse adminUpdateUserAttributesResponse = adminAmazonCognitoIdentityProviderClient
            .AdminUpdateUserAttributesAsync(adminUpdateUserAttributesRequest)
            .Result;


        AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest
        {
            UserPoolId = userPoolId,
            ClientId = appClientId,
            AuthFlow = "ADMIN_NO_SRP_AUTH",
            AuthParameters = new Dictionary<string, string>
            {
                { "USERNAME", username},
                { "PASSWORD", password}
            }
        };

        AdminInitiateAuthResponse adminInitiateAuthResponse = await adminAmazonCognitoIdentityProviderClient
            .AdminInitiateAuthAsync(adminInitiateAuthRequest)
            .ConfigureAwait(false);

        AdminRespondToAuthChallengeRequest adminRespondToAuthChallengeRequest = new AdminRespondToAuthChallengeRequest
        {
            ChallengeName = ChallengeNameType.NEW_PASSWORD_REQUIRED,
            ClientId = appClientId,
            UserPoolId = userPoolId,
            ChallengeResponses = new Dictionary<string, string>
                    {
                        { "USERNAME", username },
                        { "NEW_PASSWORD", password }
                    },
            Session = adminInitiateAuthResponse.Session
        };

        AdminRespondToAuthChallengeResponse adminRespondToAuthChallengeResponse = adminAmazonCognitoIdentityProviderClient
            .AdminRespondToAuthChallengeAsync(adminRespondToAuthChallengeRequest)
            .Result;
    }

    public async Task AdminAddUserToGroupAsync(
        string username,
        string userPoolId,
        string groupName)
    {
        AdminAddUserToGroupRequest adminAddUserToGroupRequest = new AdminAddUserToGroupRequest
        {
            Username = username,
            UserPoolId = userPoolId,
            GroupName = groupName
        };

        AdminAddUserToGroupResponse adminAddUserToGroupResponse = await adminAmazonCognitoIdentityProviderClient
            .AdminAddUserToGroupAsync(adminAddUserToGroupRequest)
            .ConfigureAwait(false);
    }

    public async Task<AdminInitiateAuthResponse> AdminAuthenticateUserAsync(
        string username,
        string password,
        string userPoolId,
        string appClientId)
    {
        AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest
        {
            UserPoolId = userPoolId,
            ClientId = appClientId,
            AuthFlow = "ADMIN_NO_SRP_AUTH",
            AuthParameters = new Dictionary<string, string>
            {
                { "USERNAME", username},
                { "PASSWORD", password}
            }
        };
        return await adminAmazonCognitoIdentityProviderClient
            .AdminInitiateAuthAsync(adminInitiateAuthRequest)
            .ConfigureAwait(false);
    }

    public async Task AdminRemoveUserFromGroupAsync(
        string username,
        string userPoolId,
        string groupName)
    {
        AdminRemoveUserFromGroupRequest adminRemoveUserFromGroupRequest = new AdminRemoveUserFromGroupRequest
        {
            Username = username,
            UserPoolId = userPoolId,
            GroupName = groupName
        };

        await adminAmazonCognitoIdentityProviderClient
            .AdminRemoveUserFromGroupAsync(adminRemoveUserFromGroupRequest)
            .ConfigureAwait(false);
    }

    public async Task AdminDisableUserAsync(
        string username,
        string userPoolId)
    {
        AdminDisableUserRequest adminDisableUserRequest = new AdminDisableUserRequest
        {
            Username = username,
            UserPoolId = userPoolId
        };

        await adminAmazonCognitoIdentityProviderClient
            .AdminDisableUserAsync(adminDisableUserRequest)
            .ConfigureAwait(false);
    }

    public async Task AdminDeleteUserAsync(
        string username,
        string userPoolId)
    {
        AdminDeleteUserRequest deleteUserRequest = new AdminDeleteUserRequest
        {
            Username = username,
            UserPoolId = userPoolId
        };

        await adminAmazonCognitoIdentityProviderClient
            .AdminDeleteUserAsync(deleteUserRequest)
            .ConfigureAwait(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么在您花了所有时间添加此代码后,OP 没有花时间至少做出响应。只是想让您知道是否对我有用,谢谢! (4认同)