

 AWS SDK for .NET V3 がメンテナンスモードになりました。

[AWS SDK for .NET V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html) に移行することをお勧めします。移行方法の詳細と情報については、[メンテナンスモードのお知らせ](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon CognitoAuthentication 拡張ライブラリの例
<a name="cognito-authentication-extension"></a>

**注記**  
このトピックの情報は、.NET Framework および AWS SDK for .NET バージョン 3.3 以前のプロジェクトに固有のものです。

CognitoAuthentication 拡張ライブラリは、.NET Core および Xamarin デベロッパーによる Amazon Cognito ユーザープールの認証プロセスを簡素化するもので、[Amazon.Extensions.CognitoAuthentication](https://www.nuget.org/packages/Amazon.Extensions.CognitoAuthentication/) NuGet パッケージで提供されています。このライブラリは、Amazon Cognito ID プロバイダー API に基づいて構築されており、ユーザー認証 API コールを作成して送信します。

## CognitoAuthentication 拡張ライブラリの使用
<a name="using-the-cognitoauthentication-extension-library"></a>

Amazon Cognito には、Secure Remote Password (SRP) を通じてユーザー名とパスワードを検証する標準的な認証フローのための、組み込みの `AuthFlow` 値と `ChallengeName` 値がいくつかあります。認証フローの詳細については、「[Amazon Cognito ユーザープール認証フロー](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html)」を参照してください。

以下の例では、これらの `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;
```

### 基本的な認証の使用
<a name="use-basic-authentication"></a>

[AnonymousAWSCredentials](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TAnonymousAWSCredentials.html) を使用して、署名付きリクエストを必要としない [AmazonCognitoIdentityProviderClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CognitoIdentityProvider/TCognitoIdentityProviderClient.html) を作成します。リージョンを指定する必要はありませんが、基盤となるコードはリージョンが提供されない場合 `FallbackRegionFactory.GetRegionEndpoint()` を呼び出します。`CognitoUserPool` および `CognitoUser` オブジェクトを作成します。ユーザーパスワードを含む `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;

}
```

### チャレンジを使用した認証
<a name="authenticate-with-challenges"></a>

NewPasswordRequired や多要素認証 (MFA) などのチャレンジを使用して認証フローを継続することも、より簡単な方法です。唯一の要件は、CognitoAuthentication オブジェクト、SRP 用のユーザーパスワード、およびユーザーが入力することにより取得される、次のチャレンジに必要な情報です。次のコードは、チャレンジタイプを確認し、認証フロー中の MFA および NewPasswordRequired チャレンジに対する適切な応答を取得する方法の 1 つを示しています。

前と同じように、基本的な認証リクエストと `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.");
    }
 
}
```

### 認証後に AWS リソースを使用する
<a name="use-aws-resources-after-authentication"></a>

CognitoAuthentication ライブラリを使用してユーザーが認証されたら、次のステップは、ユーザーに適切な AWS リソースへのアクセスを許可することです。そのためには、Amazon Cognito フェデレーテッド ID コンソールを通じて ID プールを作成する必要があります。プロバイダーとして作成した Amazon Cognito ユーザープールを、その poolID および clientID を使用して指定することにより、Amazon Cognito ユーザープールのユーザーがアカウントに接続された AWS リソースにアクセスすることを許可できます。異なるロールを指定して、認証されていないユーザーと認証されたユーザーの両方が異なるリソースにアクセスするようにもできます。IAM コンソールでこれらのルールを変更できます。ロールのアタッチされたポリシーの [**アクション**] フィールドで、アクセス許可を追加または削除できます。次に、適切な ID プール、ユーザープール、Amazon Cognito ユーザー情報を使用して、さまざまな AWS リソースを呼び出すことができます。次の例は、SRP で認証されたユーザーが、関連付けられた ID プールのロールによって許可された異なる Amazon S3 バケットにアクセスする方法を示しています。

```
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);
        }
    }
}
```

## その他の認証オプション
<a name="more-authentication-options"></a>

SRP に加えて、NewPasswordRequired、MFA、CognitoAuthentication 拡張ライブラリは、以下の簡単な認証フローを提供しています。
+ Custom - `StartWithCustomAuthAsync(InitiateCustomAuthRequest customRequest)` を呼び出すことで開始する 
+ RefreshToken - `StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest)` を呼び出すことで開始する 
+ RefreshTokenSRP - `StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest)` を呼び出すことで開始する 
+ AdminNoSRP - `StartWithAdminNoSrpAuthAsync(InitiateAdminNoSrpAuthRequest adminAuthRequest)` を呼び出すことで開始する 

フローに応じて適切なメソッドを呼び出します。その後、各メソッド呼び出しの `AuthFlowResponse` オブジェクトで示されるように、ユーザーにチャレンジを表示し続けます。また、MFA チャレンジには `RespondToSmsMfaAuthAsync`、カスタムチャレンジには `RespondToCustomAuthAsync` など、適切なレスポンスメソッドを呼び出します。