

のバージョン 4 (V4) AWS SDK for .NET がリリースされました。

重要な変更とアプリケーションの移行については、[「移行トピック](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)」を参照してください。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

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

# Amazon Cognito を使用したユーザー認証
<a name="cognito-apis-intro"></a>

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

Amazon Cognito Identity を使用すると、ユーザーの一意の ID を作成し、Amazon S3 や Amazon DynamoDB などの AWS リソースへの安全なアクセスのために認証できます。Amazon Cognito ID では、公開 ID プロバイダー (Amazon、Facebook、Twitter/Digits、Google、あるいは OpenID Connect と互換性のあるプロバイダーなど) および未認証 ID がサポートされています。また Cognito では、[デベロッパーが認証した ID](https://aws.amazon.com/blogs/mobile/amazon-cognito-announcing-developer-authenticated-identities/) もサポートされており、Amazon Cognito Sync を使用したユーザーデータの同期と AWS リソースへのアクセスを活用しながら、独自のバックエンド認証プロセスを通じてユーザー登録や認証ができます。

[Amazon Cognito](https://aws.amazon.com/cognito/) の詳細については、[Amazon Cognito デベロッパーガイド](https://docs.aws.amazon.com/cognito/latest/developerguide/) を参照してください。

以下のコード例では、Amazon Cognito ID を簡単に使用する方法を示しています。[認証情報プロバイダー](cognito-creds-provider.md) の例では、ユーザー ID を作成して認証する方法を示しています。[CognitoAuthentication 拡張ライブラリ](cognito-authentication-extension.md) の例では、CognitoAuthentication 拡張ライブラリを使用して Amazon Cognito ユーザープールの認証を行う方法を示しています。

**Topics**
+ [認証情報プロバイダー](cognito-creds-provider.md)
+ [CognitoAuthentication 拡張ライブラリ](cognito-authentication-extension.md)

# Amazon Cognito 認証情報プロバイダー
<a name="cognito-creds-provider"></a>

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

 `Amazon.CognitoIdentity.CognitoAWSCredentials`[AWSSDK.CognitoIdentity](https://www.nuget.org/packages/AWSSDK.CognitoIdentity/) NuGet パッケージにある は、Amazon Cognito と AWS Security Token Service (AWS STS) を使用して AWS 呼び出しを行う認証情報を取得する認証情報オブジェクトです。

`CognitoAWSCredentials` の設定での最初のステップは「ID プール」を作成することです。(アイデンティティプールとは、お客様のアカウントに固有のユーザー ID 情報のストアです。) 情報はクライアントプラットフォーム、デバイス、およびオペレーティングシステム間で取得可能です。これにより、ユーザーが電話でアプリの使用を開始して、後でタブレットに切り替えた場合でも、保持されたアプリ情報はそのユーザーに対して引き続き利用可能になります。Amazon Cognito コンソールから新しい ID プールを作成できます。コンソールを使用している場合は、必要なその他の情報も提供します。
+ アカウント番号 - 123456789012 などの、アカウントに一意な 12 桁の数字。
+ 認証されていないロール ARN - 認証されていないユーザーが引き受けるロール。たとえば、このロールは、データへの読み取り専用アクセス許可を提供できます。
+ 認証されたロール ARN - 認証されたユーザーが引き受けるロール。このロールは、データへのより広範なアクセス許可を提供できます。

## CognitoAWSCredentials をセットアップする
<a name="set-up-cognitoawscredentials"></a>

次のコード例では、認証されていないユーザーとして Amazon S3 を呼び出すことを可能にする `CognitoAWSCredentials` のセットアップ方法を示しています。これにより、ユーザーを認証するのに必要な最小量のデータだけで呼び出すことができます。ユーザーアクセス許可はロールによって制御されるため、必要に応じてアクセスを設定することもできます。

```
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
    accountId,        // Account number
    identityPoolId,   // Identity pool ID
    unAuthRoleArn,    // Role for unauthenticated users
    null,             // Role for authenticated users, not set
    region);
using (var s3Client = new AmazonS3Client(credentials))
{
    s3Client.ListBuckets();
}
```

## 認証されていないユーザー AWS として を使用する
<a name="use-aws-as-an-unauthenticated-user"></a>

次のコード例は、認証されていないユーザー AWS として の使用を開始し、Facebook を介して認証し、Facebook 認証情報を使用するように認証情報を更新する方法を示しています。この方法を使用すると、認証されたロールを通じて、認証されたユーザーにさまざまな機能を付与できるようになります。たとえば、ユーザーが匿名でコンテンツを表示することを許可するものの、1 つ以上の設定済みプロバイダーでログオンしている場合に投稿を許可する電話アプリケーションがあります。

```
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
    accountId, identityPoolId,
    unAuthRoleArn,    // Role for unauthenticated users
    authRoleArn,      // Role for authenticated users
    region);
using (var s3Client = new AmazonS3Client(credentials))
{
    // Initial use will be unauthenticated
    s3Client.ListBuckets();

    // Authenticate user through Facebook
    string facebookToken = GetFacebookAuthToken();

    // Add Facebook login to credentials. This clears the current AWS credentials
    // and retrieves new AWS credentials using the authenticated role.
    credentials.AddLogin("graph.facebook.com", facebookAccessToken);

    // This call is performed with the authenticated role and credentials
    s3Client.ListBuckets();
}
```

`CognitoAWSCredentials` オブジェクトは、 AWS SDK for .NETの一部である `AmazonCognitoSyncClient` で使用した場合、さらに多くの機能を提供します。`AmazonCognitoSyncClient` と `CognitoAWSCredentials` の両方を使用している場合は、`AmazonCognitoSyncClient` を使用して呼び出しを行うときに `IdentityPoolId` と `IdentityId` のプロパティを指定する必要はありません。これらのプロパティは `CognitoAWSCredentials` から自動的に入力されます。次のコード例では、これとともに、`IdentityId` の `CognitoAWSCredentials` が変更されるたびに通知するイベントを示します。`IdentityId` は、たとえば、認証されていないユーザーから認証されたユーザーに変更する際など、場合によって変更されます。

```
CognitoAWSCredentials credentials = GetCognitoAWSCredentials();

// Log identity changes
credentials.IdentityChangedEvent += (sender, args) =>
{
    Console.WriteLine("Identity changed: [{0}] => [{1}]", args.OldIdentityId, args.NewIdentityId);
};

using (var syncClient = new AmazonCognitoSyncClient(credentials))
{
    var result = syncClient.ListRecords(new ListRecordsRequest
    {
        DatasetName = datasetName
        // No need to specify these properties
        //IdentityId = "...",
        //IdentityPoolId = "..."        
    });
}
```

# 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/v4/apidocs/items/Runtime/TAnonymousAWSCredentials.html) を使用して、署名付きリクエストを必要としない [AmazonCognitoIdentityProviderClient](https://docs.aws.amazon.com/sdkfornet/v4/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` など、適切なレスポンスメソッドを呼び出します。