CognitoのUserAttributesをC#から取得

Cognito C#言語から接続

Amazon Cognitoは、OpenID Connect などのエンタープライズ ID プロバイダーを通してサインインすることができるAWS内のサービスです。Cognitoのユーザープールにユーザーを追加すると、ユーザー内にUserAttributes情報を収納できます。そのCognito UserAttributesをC#言語を使ってユーザーにログインしUserAttributesを取得するコード例です。

パッケージインストール

Visual Studio C#で新規プロジェクトを作成し、下記のようにnugetからAWSSDKの必要なパッケージをインストールします

Install-Package AWSSDK.Core -Version 3.7.5.9
Install-Package AWSSDK.CognitoIdentity -Version 3.7.0.110 #←これは要らないかも
Install-Package AWSSDK.CognitoIdentityProvider -Version 3.7.1.82
Install-Package Amazon.Extensions.CognitoAuthentication -Version 2.2.2

AWSコンソール画面から[プールID]と[アプリクライアント ID]を用意

下のようにAWSコンソール画面(ブラウザ)などからユーザープールを選択し[プールID]と[アプリクライアントID]情報を取得します。

プールID取得方法
[ユーザープール]→[全般設定]→[プールID]
アプリクライアントID取得方法
[ユーザープール]→[アプリクライアント]→[アプリクライアントID]

コード例

usingで必要なのは下記の3行です

using Amazon;
using Amazon.CognitoIdentityProvider;
using Amazon.Extensions.CognitoAuthentication;
private void button1_Click(object sender, EventArgs e)
{
	string poolId = "ap-northeast-1_さきほど用意したプールID";
	string clientId = "さきほど用意したアプリクライアントID";
	string userId = textBox1.Text; //Cognitoでユーザー追加設定したユーザー名
	string passWd = textBox2.Text; //Cognitoでユーザー追加設定したパスワード
	AmazonCognitoIdentityProviderClient amazonCognitoIdentityProviderClient1 = new(new Amazon.Runtime.AnonymousAWSCredentials(), RegionEndpoint.APNortheast1);
	CognitoUserPool cognitoUserPool1 = new(poolId, clientId, amazonCognitoIdentityProviderClient1);
	CognitoUser cognitoUser1 = new(userId, clientId, cognitoUserPool1,amazonCognitoIdentityProviderClient1);

	InitiateSrpAuthRequest initiateSrpAuthRequest1 = new()
	{
		Password = passWd
	};
	var authResponse = cognitoUser1.StartWithSrpAuthAsync(initiateSrpAuthRequest1).ConfigureAwait(true).GetAwaiter();        
	var _idToken = authResponse.GetResult().AuthenticationResult;
	var _getUserResponse = cognitoUser1.GetUserDetailsAsync().ConfigureAwait(false).GetAwaiter();
	var _userResponse = _getUserResponse.GetResult();
	textBox3.Clear();
	_userResponse.UserAttributes.ForEach(_v => {
		textBox3.Text += string.Format("{0}={1}\r\n", _v.Name, _v.Value);
	});
}

async / awaitは利用していませんが、非同期処理実装も可能です。AWSSDKの場合GetAwaiter() / GetResult()を使います。

Amazon Cognito ユーザーデータ取得画面

秘密鍵 pemからppkファイル変換

ppkファイルテスト

AWS EC2で Linuxサーバーを構築したときなど、パスワードのような短いキーフレーズではなくpemという拡張子のファイルを秘密鍵としてダウンロードしてからsshでログインすることが一般的になっています。pemファイル(Privacy Enhanced Mail)は、Base64で符号化された文字列が入ったテキストファイルです。最初の行には「—–BEGIN RSA PRIVATE KEY—–」が入っています。このファイルを利用して作成したEC2サーバーへsshログインが出来ます。下記がmacOSを使ったsshでのログイン時のコマンドです。

ssh -i "***.pem" ユーザー@*.ap-northeast-1.compute.amazonaws.com

pemファイルがあればmacOSでは不自由なく作成したEC2へログインできるのですがWindowsの場合このpemファイルをppkファイル(PuTTY Private Key files)に変換する必要があるようです。このppkファイルへの変換ツールはPuTTYというツールでインターネットからダウンロードできます。PuTTYのダウンロードは下記URLです

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

64ビット版インストーラー 2020年9月現在putty-64bit-0.74-installer.msiファイルをダウンロードしダブルクリックでインストールすると「C:\Program Files\PuTTY」にいくつかのexe実行ファイルがインストールされていることが確認できます。Windows 10のアプリ一覧からPuTTYgenを実行します。

PuTTYgen起動
PuTTYgen起動

実行すると下のような[PuTTYgen Key Generator]画面が出てきます。その画面の中央少ししたに[Load]と書かれたボタンがあるのでクリックします。

PuTTYgen Key Generator画面
PuTTYgen Key Generator画面

オープンダイアログが出てきてpemファイルを選択しますがオープンダイアログは拡張子ppkしか選択できない状態なので画面下の[ファイル名]を「*.pem」に変更しエンターキーを押します。(エンターキーはパンパン叩かない)

ファイル名テキスト入力項目を「*.pem」に変更
ファイル名テキスト入力項目を「*.pem」に変更

ファイル一覧に目的のpemファイルが表示されたら「開く」ボタンをクリックします。成功した場合Successfullyダイアログが表示されいます。

Successfullyダイアログが
Successfullyダイアログ

[Save Private Key]ボタンをクリックしppkファイルを保存します。

ppkファイルを保存
ppkファイルを保存

ppkファイルの作成が出来たらコマンドプロンプトから下記のように「C:\Program Files\PuTTY\plink.exe」を用いテストを行います。

"C:\Program Files\PuTTY\plink.exe" -ssh ユーザー名@EC2サーバーIP -P 22 -i "ファイル名.ppk" -N -L 3307:127.0.0.1:3306

下のように「Access granted. Press Return to begin session.」と表示されればOKです。

Access granted. Press Return to begin session.
Access granted. Press Return to begin session.

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED