.NET 애플리케이션만 사용하는 SSO 자습서 - AWS SDK for .NET

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

.NET 애플리케이션만 사용하는 SSO 자습서

이 자습서에서는 기본 애플리케이션 및 테스트 SSO 사용자를 위해 SSO를 활성화하는 방법을 보여줍니다. AWS CLI를 사용하는 대신 프로그래밍 방식으로 임시 SSO 토큰을 생성하도록 애플리케이션을 구성합니다.

이 자습서에서는 AWS SDK for .NET의 SSO 기능 중 일부를 보여 줍니다. AWS SDK for .NET로 IAM Identity Center를 사용하는 방법에 대한 자세한 내용은 배경 정보가 포함된 주제를 참조하세요. 해당 항목에서는 특히 .NET 애플리케이션만 해당이라는 하위 섹션의 이 시나리오에 대한 고급 설명을 참조하세요.

참고

이 자습서의 여러 단계는 AWS Organizations 및 IAM Identity Center와 같은 서비스를 구성하는 데 도움이 됩니다. 해당 구성을 이미 수행했거나 코드에만 관심이 있다면 예제 코드가 있는 섹션으로 건너뛰어도 됩니다.

필수 조건

  • 아직 구성하지 않은 경우 개발 환경을 구성합니다. 이에 대해서는 도구 체인 설치 및 구성시작하기와 같은 섹션에 설명되어 있습니다.

  • SSO 테스트에 사용할 수 있는 최소 하나의 AWS 계정를 식별하거나 생성하십시오. 이 자습서에서는 이를 테스트 AWS 계정 또는 간단히 테스트 계정이라고 합니다.

  • 대신 SSO를 테스트할 수 있는 SSO 사용자를 지정하십시오. 이 사람은 사용자가 생성한 기본 애플리케이션과 SSO를 사용할 사람입니다. 이 자습서에서 그 사람은 사용자(개발자)일 수도 있고 다른 사람일 수도 있습니다. 또한 SSO 사용자가 개발 환경에 있지 않은 컴퓨터에서 작업하도록 설정하는 것이 좋습니다. 그러나 이 작업이 꼭 필요한 것은 아닙니다.

  • SSO 사용자 컴퓨터에는 개발 환경을 설정하는 데 사용한 프레임워크와 호환되는 .NET 프레임워크가 설치되어 있어야 합니다.

AWS 설정

이 섹션에서는 이 자습서용으로 다양한 AWS 서비스를 설정하는 방법을 보여줍니다.

이 설정을 수행하려면 먼저 테스트 AWS 계정에 관리자로 로그인하십시오. 뒤이어 다음과 같이 하세요.

Amazon S3

Amazon S3 콘솔로 이동하여 무해한 버킷을 추가하십시오. 이 자습서의 뒷부분에서 SSO 사용자는 이러한 버킷의 목록을 검색하게 됩니다.

AWS IAM

IAM 콘솔로 이동하여 IAM 사용자 몇 명을 추가합니다. IAM 사용자에게 권한을 부여하는 경우 권한을 몇 가지 무해한 읽기 전용 권한으로 제한하십시오. 이 자습서의 뒷부분에서 SSO 사용자는 이러한 IAM 사용자의 목록을 검색하게 됩니다.

AWS Organizations

AWS Organizations 콘솔로 이동하여 조직을 활성화합니다. 자세한 내용은 AWS Organizations 사용 설명서조직 생성을 참조하세요.

이 작업을 수행하면 테스트 AWS 계정가 조직에 관리 계정으로 추가됩니다. 추가 테스트 계정이 있는 경우 해당 계정을 조직에 가입하도록 초대할 수 있지만 이 자습서에서는 그렇게 하지 않아도 됩니다.

IAM Identity Center

IAM ID Center 콘솔로 이동하여 SSO를 활성화하십시오. 필요한 경우 이메일 확인을 수행합니다. 자세한 내용은 IAM Identity Center 사용 설명서IAM Identity Center 활성화를 참조하세요.

그런 다음 다음과 같이 구성합니다.

  1. 설정 페이지로 이동합니다. "액세스 포털 URL"을 찾아 나중에 사용할 수 있도록 sso_start_url 설정에 값을 기록해 두세요.

  2. AWS Management Console의 배너에서 SSO를 활성화했을 때 설정된 AWS 리전을 찾아보세요. AWS 계정 ID 왼쪽에 있는 드롭다운 메뉴입니다. 나중에 사용할 수 있도록 sso_region 설정에 리전 코드를 기록해 둡니다. 이 코드는 us-east-1과 비슷합니다.

  3. 다음과 같이 SSO 사용자를 생성합니다.

    1. 사용자 페이지로 이동합니다.

    2. 사용자 추가를 선택하고 사용자의 사용자 이름, 이메일 주소, 이름, 을 입력합니다. 그리고 다음(Next)을 선택합니다.

    3. 그룹 페이지에서 다음을 선택한 다음 정보를 검토하고 사용자 추가를 선택합니다.

  4. 다음과 같이 그룹을 생성합니다.

    1. 그룹 페이지로 이동합니다.

    2. 그룹 생성을 선택하고 그룹의 그룹 이름설명을 입력합니다.

    3. 그룹에 사용자 추가 섹션에서 이전에 만든 테스트 SSO 사용자를 선택합니다. 그런 다음, 그룹 생성을 선택합니다.

  5. 다음과 같이 권한 세트를 생성합니다.

    1. 권한 세트 페이지로 이동하여 권한 세트 생성을 선택합니다.

    2. 권한 세트 유형에서 사용자 지정 권한 세트를 선택하고 다음을 선택합니다.

    3. 인라인 정책을 열고 다음 정책을 입력합니다.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "iam:ListUsers" ], "Resource": "*" } ] }
    4. 이 자습서에서는 권한 세트 이름으로 SSOReadOnlyRole을 입력합니다. 원하는 경우 설명을 추가하고 다음을 선택합니다.

    5. 정보를 검토한 후 생성을 선택합니다.

    6. 나중에 사용할 수 있도록 sso_role_name 설정에 권한 세트의 이름을 기록해 둡니다.

  6. AWS 계정 페이지로 이동하여 이전에 조직에 추가한 AWS 계정을 선택합니다.

  7. 해당 페이지의 개요 섹션에서 계정 ID를 찾아 나중에 sso_account_id 설정에서 사용할 수 있도록 기록해 둡니다.

  8. 사용자 및 그룹 탭을 선택한 다음 사용자 또는 그룹 할당을 선택합니다.

  9. 사용자 및 그룹 할당 페이지에서 그룹 탭을 선택하고 이전에 만든 그룹을 선택한 후 다음을 선택합니다.

  10. 이전에 만든 권한 세트를 선택하고 다음을 선택한 다음 제출을 선택합니다. 구성은 몇 분 정도 걸립니다.

예제 애플리케이션 생성

다음 애플리케이션을 생성합니다. SSO 사용자 컴퓨터에서 실행됩니다.

AWSSDK.S3AWSSDK.SecurityToken 외에도 AWSSDK.SSOAWSSDK.SSOOIDC NuGet 패키지를 포함합니다.

using System; using System.Threading.Tasks; using System.Diagnostics; // 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.Programmatic_login { class Program { // Requirements: // - An SSO profile in the SSO user's shared config file. // 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"); var ssoCredentials = credentials as SSOAWSCredentials; ssoCredentials.Options.ClientName = "Example-SSO-App"; ssoCredentials.Options.SsoVerificationCallback = args => { // Launch a browser window that prompts the SSO user to complete an SSO login. // This method is only invoked if the session doesn't already have a valid SSO token. // NOTE: Process.Start might not support launching a browser on macOS or Linux. If not, // use an appropriate mechanism on those systems instead. Process.Start(new ProcessStartInfo { FileName = args.VerificationUriComplete, UseShellExecute = true }); }; return ssoCredentials; } } // 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; } } }

AWSSDK.IdentityManagementAWSSDK.SecurityToken 외에도 AWSSDK.SSOAWSSDK.SSOOIDC NuGet 패키지를 포함합니다.

using System; using System.Threading.Tasks; using System.Diagnostics; // 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.Programmatic_login { class Program { // Requirements: // - An SSO profile in the SSO user's shared config file. // 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"); var ssoCredentials = credentials as SSOAWSCredentials; ssoCredentials.Options.ClientName = "Example-SSO-App"; ssoCredentials.Options.SsoVerificationCallback = args => { // Launch a browser window that prompts the SSO user to complete an SSO login. // This method is only invoked if the session doesn't already have a valid SSO token. // NOTE: Process.Start might not support launching a browser on macOS or Linux. If not, // use an appropriate mechanism on those systems instead. Process.Start(new ProcessStartInfo { FileName = args.VerificationUriComplete, UseShellExecute = true }); }; return ssoCredentials; } } // 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 사용자 목록을 표시하는 것 외에도 이러한 애플리케이션은 이 자습서에서 my-sso-profile인 SSO 지원 프로필에 대한 사용자 자격 증명 ARN도 표시합니다.

이러한 애플리케이션은 SSOAWSCredentials 객체의 옵션 속성에 콜백 메서드를 제공하여 SSO 로그인 작업을 수행합니다.

SSO 사용자 지시

SSO 사용자에게 이메일을 확인하고 SSO 초대를 수락하도록 요청하세요. 비밀번호를 설정하라는 메시지가 표시됩니다. 메시지가 SSO 사용자의 받은 편지함에 도착하는 데 몇 분 정도 걸릴 수 있습니다.

SSO 사용자에게 이전에 생성한 애플리케이션을 제공합니다.

그런 다음 SSO 사용자에게 다음을 수행하도록 하세요.

  1. 공유 AWS config 파일이 들어 있는 폴더가 없으면 새로 만드십시오. 폴더가 존재하고 .sso라는 하위 폴더가 있는 경우 해당 하위 폴더를 삭제하세요.

    이 폴더의 위치는 일반적으로 Windows의 %USERPROFILE%\.aws, Linux와 macOS의 ~/.aws에 있습니다.

  2. 필요한 경우 해당 폴더에 공유 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
  3. Amazon S3 애플리케이션을 실행합니다.

  4. 결과 웹 로그인 페이지에서 로그인합니다. 초대 메시지에 있는 사용자 이름과 메시지에 대한 응답으로 생성된 비밀번호를 사용하세요.

  5. 로그인이 완료되면 애플리케이션에 S3 버킷 목록이 표시됩니다.

  6. IAM 애플리케이션을 실행합니다. 애플리케이션에 IAM 사용자 목록이 표시됩니다. 두 번째 로그인이 수행되지 않았더라도 마찬가지입니다. IAM 애플리케이션은 이전에 생성된 임시 토큰을 사용합니다.

정리

이 자습서에서 생성한 리소스를 보관하지 않으려면 정리하세요. 이는 개발 환경에서 파일 및 폴더 같은 AWS 리소스일 수 있습니다.