AWS を介して構成および保護された API およびその他のサービスがあります。Cognito のグループとフェデレーション ID を使用してリソースへのアクセスを許可/拒否するために、RBAC スタイルのアクセス許可システムを適用しました。
ユーザーがシステムにログインすると、アクセスできる cognio:roles をリストする JWT トークンを取得し、そのリソースの一時的なセッション トークンを要求することで、これらを使用してさまざまなアクションを実行できます。
私は現在、Angular Web サイトを持っています。これは期待どおりに機能しており、ユーザーがログインすると、次のようにセッション トークンを要求できます。
buildCognitoCreds(idTokenJwt: string, customRoleArn: string) {
let url = 'cognito-idp.' + CognitoUtil._REGION.toLowerCase() + '.amazonaws.com/' + CognitoUtil._USER_POOL_ID;
let logins: CognitoIdentity.LoginsMap = {};
logins[url] = idTokenJwt;
let params = {
IdentityPoolId: CognitoUtil._IDENTITY_POOL_ID, /* required */
Logins: logins,
CustomRoleArn: customRoleArn
};
let serviceConfigs: awsservice.ServiceConfigurationOptions = {};
let creds = new AWS.CognitoIdentityCredentials(params, serviceConfigs);
console.log('Creds for role: ' + customRoleArn + ':', creds);
this.setCognitoCreds(creds);
return creds;
}
AWS リソース/API にアクセスする必要がある多数のデスクトップおよびモバイル (Xamarin) アプリがあるため、.net で同じことをしようとしています。
ここで AWS ブログをフォローしました: https://aws.amazon.com/blogs/developer/cognitoauthentication-extension-library-developer-preview/ で、cognito ユーザープールに対してユーザーを認証できます。
ユーザーがアクセス許可を持つ特定のロールのセッショントークンを取得する方法として、私は今行き詰まっています-私は以下を使用してみました:
var credentials = _authenticationService.User.GetCognitoAWSCredentials(
"us-east-1:ef964b45-939e-4ef3-91c6-xxxxxxxxxxxx", // Identity pool ID
RegionEndpoint.USEast1 // Region
);
var url = "cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx";
var logins = new Dictionary<string, string>();
logins.Add(url, _authenticationService.AuthenticationResult.IdToken);
GetCredentialsForIdentityRequest request = new GetCredentialsForIdentityRequest();
request.IdentityId = "us-east-1:ef964b45-939e-4ef3-91c6-xxxxxxxxxxxxx";
request.Logins = logins;
request.CustomRoleArn = customRoleArn;
var c = new AmazonCognitoIdentityClient(credentials, RegionEndpoint.USEast1);
var test = c.GetIdentityPoolRolesAsync("us-east-1:ef964b45-939e-4ef3-91c6-xxxxxxxxxxxxxx").Result;
var result = c.GetCredentialsForIdentityAsync(request).Result;
Console.WriteLine(result.Credentials.AccessKeyId);
ただし、毎回次Amazon.CognitoIdentity.Model.NotAuthorizedException
のメッセージが表示されます。
The ambiguous role mapping rules for: cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx denied this request.
コードのトレースとテストから、cognito ユーザーから cognito を取得するときに使用する CustomRoleArn を指定する必要があるようです。そうしないと、cognito フェデレーション ID のトークン ベースのルールが拒否応答を返します。- しかし、AWS .net SDK でこれを行う方法がわかりません......