如何使用SAML令牌获取AWS凭证?

时间:2019-01-02 22:30:49

标签: javascript amazon-web-services

我想做的事情:使用ADFS对我的用户进行身份验证,将SAML响应令牌传递给AWS并获取凭证,然后我可以使用它们来访问AWS资源。

我现在能做的:通过ADFS成功登录并取回SAML令牌,以确认成功登录。

不起作用:调用AWS.STS.assumeRoleWithSaml函数会收到403 Access Denied错误

到目前为止,它是如何工作的:

  1. 用户单击我的应用程序上的按钮,该按钮将调用以下内容:

    var RPID = encodeURIComponent('urn:amazon:webservices');
    var result = 'https://virtualMachine.eastus.cloudapp.azure.com/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=' + RPID;
    window.location.href = result;
    
  2. 此处成功登录会向应用程序返回SAML响应令牌

    var saml = new URL(window.location.href);
    var token = saml.searchParams.get('SAMLResponse');
    
  3. 然后,该应用程序调用假定RoleWithSAML以获取凭据。委托人ARN指的是我要访问的身份提供者,而RoleARN指的是对所有内容都具有完全访问权限的角色:

    authenticateSAMLwithCognito(token) {
    //define our security token service object
    var sts = new AWS.STS();
    //build our parameter object
    var params = {
        //cognito identity provider
        PrincipalArn: 'arn:aws:iam::accountid:saml-provider/wmpo-adfs',
        //role assuming
        RoleArn: 'arn:aws:iam::accountid:role/ADFS-Dev',
        //authorization
        SAMLAssertion: token
    }
    
    console.log("Parameters sent", params);
    sts.assumeRoleWithSAML(params, (err, data) => {
    
        if(err) console.log(err);
        else console.log("Success!", data);
    })
    }
    

不过,这次交流的回应是:

error message

我真的不确定为什么会这样,但是如果有人提出一些有用的建议,那就太好了!谢谢,新年快乐

1 个答案:

答案 0 :(得分:0)

哇,这只花了几天时间,但是尽管我一直在绊脚石,但最终还是达到了我想要达到的水平。

答案与我通过Cognito用户池通过用户名密码组合对用户进行身份验证时使用的凭据获得功能相同。

    authenticateThroughCognito(token) {
      AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-west-2:IdentityPoolId',
          Logins: {
              'arn:aws:iam::accountId:saml-provider/wmpo-adfs' : token
          }
      });

      (AWS.config.credentials as AWS.Credentials).get((err) => {
          if(err) console.log(err);
          else {
              console.log("Success");
              console.log(AWS.config.credentials);
          }
      })
    }