AWS SDK получает сессионный токен для rbac токена - PullRequest
0 голосов
/ 14 мая 2018

У меня есть API и другие сервисы, настроенные и защищенные через AWS.Мы применили систему разрешений в стиле RBAC, чтобы разрешить / запретить доступ к ресурсам с использованием групп в Cognito и федеративных идентификаторов.

Когда пользователь входит в систему, он получает токен JWT, перечисляющий роли cognio:, к которым у него есть доступ, и может использовать их для выполнения различных действий, запрашивая временный токен сеанса для этого ресурса.

В настоящее время у меня есть веб-сайт Angular, который работает, как ожидалось, и после того, как пользователь вошел в систему, может запросить токены сеанса следующим образом:

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

Я сейчас пытаюсьсделайте то же самое в .net, поскольку у нас есть несколько приложений для настольных компьютеров и мобильных устройств (Xamarin), которым требуется доступ к ресурсам / api AWS.

Я следил за блогом 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.

Из трассировки кода и тестирования кажется, что мне как-то нужно указать CustomRoleArn дляиспользуйте при получении учетных данных Cognito от Cognito User, в противном случае основанное на токене правило в федеративном удостоверении Cognito будет возвращать отказанный ответ.- Но я не могу понять, как это сделать в AWS .net SDK ......

...