本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用AWS CLI和 .NET 應用程式的 SSO 教學課程
本教學課程說明如何為基本 .NET 應用程式和測試 SSO 使用者啟用 SSO。它會使用AWS CLI來產生暫存 SSO 權杖,而不是以程式設計方式產生它。
本教學課程會顯示中的一小部分 SSO 功能AWS SDK for .NET。如需搭配使用 IAM 身分中心的完整詳細資訊AWS SDK for .NET,請參閱包含背景資訊的主題。在該主題中,請特別參閱名為的子節中此案例的高階描述AWS CLI和. NET 應用程式。
注意
本教學課程中的幾個步驟可協助您設定AWS Organizations和 IAM 身分中心等服務。如果您已經執行了這些配置,或者如果您只對代碼感興趣,則可以跳到包含示例代碼的部分。
先決條件
-
如果您尚未設定開發環境,請設定您的開發環境。這在安裝和設定您的工具鏈和之類的部分中進行了描述開始使用。
-
識別或建立至少一AWS 帳戶個可用來測試 SSO 的項目。對於本教程的目的,這被稱為測試AWS 帳戶或只是測試帳戶。
-
識別可以為您測試 SSO 的 SSO 使用者。這是將使用 SSO 和您建立的基本應用程式的人員。在本教程中,該人可能是您(開發人員)或其他人。我們也建議您使用 SSO 使用者在不在開發環境中的電腦上工作的設定。但是,這不是絕對必要的。
-
SSO 使用者的電腦必須安裝與您用來設定開發環境的 .NET 架構相容。
-
請確定 SSO 使用者的電腦上已安裝第 2 AWS CLI 版。您可以通過在命令提示符或終端
aws --version
中運行來檢查這一點。
設定 AWS
本節說明如何為本教學課程設定各種AWS服務。
若要執行此設定,請先以系統管理員身分登入測試AWS 帳戶。然後,執行以下操作:
Amazon S3
轉到 Amazon S3 控制台
AWSIAM
前往 IAM 主控台
AWS Organizations
移至AWS Organizations主控台
此動作會將測試新增AWS 帳戶至組織,做為管理帳戶。如果您有其他測試帳戶,則可以邀請他們加入組織,但這樣做不是本教學課程的必要條件。
IAM Identity Center
前往 IAM 身分中心主控台
然後,執行以下配置。
-
前往 「設定」 頁面。尋找 「存取入口網站 URL」,並記錄該值以供稍後在
sso_start_url
設定中使用。 -
在的大標題中AWS Management Console,尋找啟用 SSO 時所AWS 區域設定的。這是 AWS 帳戶 ID 左側的下拉菜單。記錄地區碼,以便稍後在
sso_region
設定中使用。此代碼將類似於us-east-1
. -
建立 SSO 使用者,如下所示:
-
前往「使用者」頁面。
-
選擇 [新增使用者],然後輸入使用者的使用者名稱、電子郵件地址、名字和姓氏。然後選擇 Next (下一步)。
-
在群組頁面上選擇 [下一步],然後檢閱資訊並選擇 [新增使用者]。
-
-
建立群組,如下所示:
-
前往「群組」頁面。
-
選擇 [建立群組] 並輸入群組的 [群組名稱] 和 [說明]。
-
在「新增使用者至群組」區段中,選取您先前建立的測試 SSO 使用者。然後,選取 [建立群組]。
-
-
建立權限集,如下所示:
-
移至 [權限集] 頁面,然後選擇 [建立權限集]。
-
在 [權限集類型] 下,選取 [自訂權限集] 並選擇 [下一步]
-
開啟內嵌政策並輸入下列原則:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "iam:ListUsers" ], "Resource": "*" } ] }
-
在本教學課程中,輸
SSOReadOnlyRole
入「權限集」名稱。視需要新增說明,然後選擇 [下一步]。 -
複查資訊,然後選擇 [建立]。
-
記錄權限集的名稱,以便稍後在
sso_role_name
設定中使用。
-
-
轉到AWS帳戶頁面,然後選擇您先前添加到組織的AWS帳戶。
-
在該頁面的「概觀」部分中,找到帳戶 ID 並將其記錄在
sso_account_id
設置中以供日後使用。 -
選擇使用者和群組索引標籤,然後選擇指派使用者或群組。
-
在 [指派使用者和群組] 頁面上,選擇 [群組] 索引標籤,選取您先前建立的群組,然後選擇 [下一步]。
-
選取您先前建立的權限集,然後選擇「下一步」,然後選擇「送出」。配置需要一些時間。
創建示例應用
建立下列應用程式。它們將在 SSO 使用者的電腦上執行。
包括 NuGet 套件AWSSDK.SSO
,以AWSSDK.S3
及除了和AWSSDK.SecurityToken
。AWSSDK.SSOOIDC
using System; using System.Threading.Tasks; // NuGet packages: AWSSDK.S3, AWSSDK.SecurityToken, AWSSDK.SSO, AWSSDK.SSOOIDC using Amazon.Runtime; using Amazon.Runtime.CredentialManagement; using Amazon.S3; using Amazon.S3.Model; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; namespace SSOExample.S3.CLI_login { class Program { // Requirements: // - An SSO profile in the SSO user's shared config file. // - An active SSO Token. // If an active SSO token isn't available, the SSO user should do the following: // In a terminal, the SSO user must call "aws sso login --profile my-sso-profile". // Class members. private static string profile = "my-sso-profile"; static async Task Main(string[] args) { // Get SSO credentials from the information in the shared config file. var ssoCreds = LoadSsoCredentials(profile); // Display the caller's identity. var ssoProfileClient = new AmazonSecurityTokenServiceClient(ssoCreds); Console.WriteLine($"\nSSO Profile:\n {await ssoProfileClient.GetCallerIdentityArn()}"); // Display a list of the account's S3 buckets. // The S3 client is created using the SSO credentials obtained earlier. var s3Client = new AmazonS3Client(ssoCreds); Console.WriteLine("\nGetting a list of your buckets..."); var listResponse = await s3Client.ListBucketsAsync(); Console.WriteLine($"Number of buckets: {listResponse.Buckets.Count}"); foreach (S3Bucket b in listResponse.Buckets) { Console.WriteLine(b.BucketName); } Console.WriteLine(); } // Method to get SSO credentials from the information in the shared config file. static AWSCredentials LoadSsoCredentials(string profile) { var chain = new CredentialProfileStoreChain(); if (!chain.TryGetAWSCredentials(profile, out var credentials)) throw new Exception($"Failed to find the {profile} profile"); return credentials; } } // Class to read the caller's identity. public static class Extensions { public static async Task<string> GetCallerIdentityArn(this IAmazonSecurityTokenService stsClient) { var response = await stsClient.GetCallerIdentityAsync(new GetCallerIdentityRequest()); return response.Arn; } } }
包括 NuGet 套件AWSSDK.SSO
,以AWSSDK.IdentityManagement
及除了和AWSSDK.SecurityToken
。AWSSDK.SSOOIDC
using System; using System.Threading.Tasks; // NuGet packages: AWSSDK.IdentityManagement, AWSSDK.SecurityToken, AWSSDK.SSO, AWSSDK.SSOOIDC using Amazon.Runtime; using Amazon.Runtime.CredentialManagement; using Amazon.IdentityManagement; using Amazon.IdentityManagement.Model; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; namespace SSOExample.IAM.CLI_login { class Program { // Requirements: // - An SSO profile in the SSO user's shared config file. // - An active SSO Token. // If an active SSO token isn't available, the SSO user should do the following: // In a terminal, the SSO user must call "aws sso login --profile my-sso-profile". // Class members. private static string profile = "my-sso-profile"; static async Task Main(string[] args) { // Get SSO credentials from the information in the shared config file. var ssoCreds = LoadSsoCredentials(profile); // Display the caller's identity. var ssoProfileClient = new AmazonSecurityTokenServiceClient(ssoCreds); Console.WriteLine($"\nSSO Profile:\n {await ssoProfileClient.GetCallerIdentityArn()}"); // Display a list of the account's IAM users. // The IAM client is created using the SSO credentials obtained earlier. var iamClient = new AmazonIdentityManagementServiceClient(ssoCreds); Console.WriteLine("\nGetting a list of IAM users..."); var listResponse = await iamClient.ListUsersAsync(); Console.WriteLine($"Number of IAM users: {listResponse.Users.Count}"); foreach (User u in listResponse.Users) { Console.WriteLine(u.UserName); } Console.WriteLine(); } // Method to get SSO credentials from the information in the shared config file. static AWSCredentials LoadSsoCredentials(string profile) { var chain = new CredentialProfileStoreChain(); if (!chain.TryGetAWSCredentials(profile, out var credentials)) throw new Exception($"Failed to find the {profile} profile"); return credentials; } } // Class to read the caller's identity. public static class Extensions { public static async Task<string> GetCallerIdentityArn(this IAmazonSecurityTokenService stsClient) { var response = await stsClient.GetCallerIdentityAsync(new GetCallerIdentityRequest()); return response.Arn; } } }
除了顯示 Amazon S3 儲存貯體和 IAM 使用者清單之外,這些應用程式還會顯示啟用 SSO 設定檔的使用者身分 ARN,這些設定檔位於本教學my-sso-profile
中。
指示 SSO 使用者
要求 SSO 使用者檢查其電子郵件並接受 SSO 邀請。系統會提示他們設定密碼。郵件可能需要幾分鐘才能送達 SSO 使用者的收件匣。
將您先前建立的應用程式提供給 SSO 使用者。
然後,請 SSO 使用者執行下列動作:
-
如果包含共享AWS
config
檔案的資料夾不存在,請建立該資料夾。如果資料夾確實存在且有名為的子資料夾.sso
,請刪除該子資料夾。此資料夾的位置通常
%USERPROFILE%\.aws
位於視~/.aws
窗、Linux 和 macOS 中。 -
如有必要,請在該資料夾中建立共享AWS
config
檔案,然後依照下列步驟在其中新增設定檔:[default] region =
<default Region>
[profile my-sso-profile] sso_start_url =<user portal URL recorded earlier>
sso_region =<Region code recorded earlier>
sso_account_id =<account ID recorded earlier>
sso_role_name = SSOReadOnlyRole -
運行 Amazon S3 應用程序。出現執行階段例外狀況。
-
執行以下 AWS CLI 命令:
aws sso login --profile my-sso-profile
-
在產生的網頁登入頁面中,登入。使用邀請郵件中的使用者名稱,以及為回應訊息而建立的密碼。
-
再次運行 Amazon S3 應用程序。應用程式現在會顯示 S3 儲存貯體的清單。
-
執行 IAM 應用程式。應用程式會顯示 IAM 使用者清單。即使未執行第二次登入,也是如此。IAM 應用程式會使用先前建立的暫時權杖。
清除
如果您不想保留您在本教學課程中建立的資源,請將它們清除。這些可能是開發環境中的資AWS源或資源,例如檔案和資料夾。