首页 > 解决方案 > AWS SDK 获取 rbac 令牌的会话令牌

问题描述

我有一个通过 AWS 配置和保护的 API 和其他服务。我们应用了 RBAC 风格的权限系统,以允许/拒绝使用 Cognito 和联合身份中的组访问资源。

当用户登录到系统时,他们会获得一个 JWT 令牌,其中列出了他们有权访问的 cognio:roles,并且可以通过为该资源请求临时会话令牌来使用这些令牌来执行不同的操作。

我目前有一个 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 中做同样的事情,因为我们有许多需要访问 AWS 资源/api 的桌面和移动 (Xamarin) 应用程序。

我在这里关注了 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 联合身份中基于令牌的规则将返回拒绝响应。- 但我不知道如何在 AWS .net SDK 中做到这一点......

标签: c#amazon-web-servicesaws-cognitoaws-sdk-net

解决方案


推荐阅读