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

Posted

技术标签:

【中文标题】使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理【英文标题】:User management in AWS Cognito User Pool using C# and .NET Core 【发布时间】:2021-01-24 18:14:23 【问题描述】:

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

【问题讨论】:

你能把它分成一个问题,然后发布其余的答案吗?让我们不要走我们在问题中托管“文章”的路径。 你能把它格式化成问答格式吗? 关闭所以没有人投票支持我的答案,这只是原始帖子的版本 @SOReader 关闭不会阻止投票。如果您不想从中获得代表,请创建您的答案社区 wiki。应该有一个复选框来做到这一点。 【参考方案1】:

@Attilio Gelosa 的原创文章

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

配置

在开始之前,我们必须:

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

登录 AWS 管理控制台

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

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

转到 AWS Identity and Access Management (IAM) 端点击 Users 链接,然后点击 Add user 按钮。

键入您要使用的用户名,打开程序访问标志并单击下一步:权限按钮。

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

单击下一步以到达最后一个选项卡并创建用户。在下一页上,您将确认创建。请记下 Access key ID 值和 Secret access key 值,或者您可以下载包含相同信息的 CSV 文件。

编辑本地凭证文件

要编辑本地凭据文件,如果您使用的是 Windows,请转到 %USERPROFILE%\.aws\credentials 或使用 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>

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

创建用户池

转到 Cognito 用户池页面并创建一个新池。键入您要使用的名称,然后单击查看默认值

在下一页,点击添加应用客户端...链接。

点击添加应用客户端

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

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

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

最后,点击创建应用客户端按钮。

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

现在创建新池,点击创建池按钮。

请注意应用客户端设置菜单下的Pool 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);
    

【讨论】:

不知道为什么 OP 在您花时间添加此代码之后没有花时间至少做出响应。只是想让您知道是否对我有用,谢谢! 在哪里可以获得有关如何使用此代码的示例或更多详细信息?【参考方案2】:

只是为了改进 SOReader 的答案,而不是执行编辑本地凭证文件和使用代码依赖本地配置文件的步骤,您可以通过使用访问密钥 id 和密钥实例化 BasicAWSCredentials 对象来替换此行为访问密钥。构造方法看起来像这样:

public CognitoUserManagement(RegionEndpoint regionEndpoint)

        adminAmazonCognitoIdentityProviderClient = new AmazonCognitoIdentityProviderClient(
            BasicAWSCredentials("access-key", "secret-key"),
            regionEndpoint);
        anonymousAmazonCognitoIdentityProviderClient = new AmazonCognitoIdentityProviderClient(
            new AnonymousAWSCredentials(),
            regionEndpoint);

【讨论】:

以上是关于使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core、C# 6 和 Visual Studio 2015 中使用本地 IIS?

是否可以在 Linux 上使用 .Net Core 3.1 创建 C++/CLI 代码的 C# DLL

如何使用 .net Core 设置 AWS 凭证

C# Asp.Net Core 使用 Redis 进行 ADDDistributedMemoryCache 和数据保护

C# .NET Core 3.1 无法建立 SSL 连接

Asp.net Core-在使用 javascript 或 C# 上传之前选择和验证 excel 文件?