已登录Cognito用户的ASP.NET Razor网站调用AWS Lambda函数咨询
Cognito登录场景下调用AWS Lambda的凭证选择
你提供的Lambda调用代码框架没问题,但凭证来源的选择要严格遵循安全规范:
AmazonLambdaClient alc = new AmazonLambdaClient(credentials); Amazon.Lambda.Model.InvokeRequest ir = new Amazon.Lambda.Model.InvokeRequest(); ir.FunctionName = "arn:aws:lambda:us-east-1:xxxx:function:get-data"; ir.Payload = ""; var res = alc.InvokeAsync(ir);
直接说结论:绝对不要用长期访问密钥/密钥,必须从User.Identity对应的Cognito会话中获取临时凭证。
原因和具体操作说明:
- 长期访问密钥是永久有效的全局凭证,在网站场景下硬编码或直接使用,一旦泄露会导致整个AWS账户面临被盗用的风险,完全违反AWS安全最佳实践
- 用户通过Cognito登录后,Cognito会自动分发临时访问密钥、密钥和会话令牌,这类凭证有有效期限制,且权限可以通过IAM角色精准管控(比如仅允许调用指定的Lambda函数)
- 你可以从Cognito的用户身份信息中提取这些临时凭证,用来初始化
AmazonLambdaClient,调整后的代码示例如下:
// 从Cognito用户会话中提取临时凭证信息 var cognitoCredentials = new SessionAWSCredentials( userIdentity.AccessKeyId, userIdentity.SecretAccessKey, userIdentity.SessionToken ); AmazonLambdaClient alc = new AmazonLambdaClient(cognitoCredentials); Amazon.Lambda.Model.InvokeRequest ir = new Amazon.Lambda.Model.InvokeRequest(); ir.FunctionName = "arn:aws:lambda:us-east-1:xxxx:function:get-data"; ir.Payload = ""; var res = alc.InvokeAsync(ir);
- 额外注意:需要给Cognito用户关联的IAM角色配置
lambda:InvokeFunction权限,确保用户具备调用目标Lambda函数的权限
内容的提问来源于stack exchange,提问作者Primico
相关产品推荐
相关产品推荐

