Amazon web services AWS API网关忽略从自定义授权器Lambda函数返回的身份验证策略
我正在尝试在API网关上实现自定义授权,这将通过从DynamoDB读取用户对其背后每个特定端点的权限来检查用户的权限 我将授权人与所讨论的方法关联(下面的屏幕截图) 授权人似乎工作正常,它返回的策略对我来说很好(查看下面的内容) 然而,不管authorizer在策略文档中返回的效果如何,API网关仍然允许所有请求通过。我从下面的API端点获取状态200以及结果集 关于API网关为什么会忽略该策略,有什么想法吗 附言。 在添加星号之前,我尝试使用显式principalID(令牌中的用户名/主题)。它的表现也一样 p.p.S 这是我的Lambda函数的完全简化版本,当前设置为始终返回Deny作为策略效果Amazon web services AWS API网关忽略从自定义授权器Lambda函数返回的身份验证策略,amazon-web-services,aws-lambda,aws-api-gateway,amazon-cognito,lambda-authorizer,Amazon Web Services,Aws Lambda,Aws Api Gateway,Amazon Cognito,Lambda Authorizer,我正在尝试在API网关上实现自定义授权,这将通过从DynamoDB读取用户对其背后每个特定端点的权限来检查用户的权限 我将授权人与所讨论的方法关联(下面的屏幕截图) 授权人似乎工作正常,它返回的策略对我来说很好(查看下面的内容) 然而,不管authorizer在策略文档中返回的效果如何,API网关仍然允许所有请求通过。我从下面的API端点获取状态200以及结果集 关于API网关为什么会忽略该策略,有什么想法吗 附言。 在添加星号之前,我尝试使用显式principalID(令牌中的用户名/主题)
public class Function
{
public AuthPolicy FunctionHandler(TokenAuthorizerContext request, ILambdaContext context)
{
var token = request.AuthorizationToken;
var stream = token;
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
var tokenS = handler.ReadToken(token) as JwtSecurityToken;
return generatePolicy(tokenS.Subject, "Deny", "arn:aws:execute-api:us-east-2:111111111111:mkvhd2q179/*");
}
private AuthPolicy generatePolicy(string principalId, string effect, string resource)
{
AuthPolicy authResponse = new AuthPolicy();
authResponse.policyDocument = new PolicyDocument();
authResponse.policyDocument.Version = "2012-10-17";// default version
authResponse.policyDocument.Statement = new Statement[1];
authResponse.principalId = "*";
Statement statementOne = new Statement();
statementOne.Action = "execute-api:Invoke"; // default action
statementOne.Effect = effect;
statementOne.Resource = resource;
authResponse.policyDocument.Statement[0] = statementOne;
return authResponse;
}
}
public class TokenAuthorizerContext
{
public string Type { get; set; }
public string AuthorizationToken { get; set; }
public string MethodArn { get; set; }
}
public class AuthPolicy
{
public PolicyDocument policyDocument { get; set; }
public string principalId { get; set; }
}
public class PolicyDocument
{
public string Version { get; set; }
public Statement[] Statement { get; set; }
}
public class Statement
{
public string Action { get; set; }
public string Effect { get; set; }
public string Resource { get; set; }
}
TL;博士删除/更改/检查网关中设置的“资源策略” 我也有类似的问题。
不知何故,我在网关上的资源策略中设置了“允许*主体访问*资源”策略,该策略与授权人返回的内容相结合。我最终删除了所有资源策略,并由授权人决定。我遇到了类似的问题。API网关资源策略的设置方式允许我们在帐户级别执行任何API(
arn:aws:execute-API:us-east-1:xxxxx:
)
即使实现了细粒度访问,其中我们返回一个只允许特定arn的策略,API网关资源策略仍然优先。因此,我删除了资源策略并重新部署了API,它允许该特定API,并拒绝其他API。或者,你可以根据你如何配置你的效果和政策声明来尝试反之亦然
初始资源策略:(我已删除并重新部署)
返回的最终Lambda身份验证策略:
{
"principalId": "xxxxxxxxxx",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:xxxxx:bxxxx/*/POST/*/someresource"
]
}
]
}
}
我也有这个问题。事实证明,从API网关控制台屏幕发出请求(例如)并没有适当地调用授权者 我猜这是因为您的控制台会话有自己的IAM策略,这会干扰授权者策略 解决方案是在API网关控制台外部手动卷曲端点。 此外,在进行更改后,不要忘记部署API!否则,您的更改将不会生效:
您是否尝试过禁用授权人的缓存?策略和令牌是为您在Authorizer中提到的TTL缓存的。我只是在看到您的评论后缓存的(感谢有用的提示)。我完全禁用了Authorizer Lambda上的缓存,并将integration request setup页面上的TTL缩短到允许的最小值50ms。这没有帮助。仍然忽略授权人。出于调试目的,您可以尝试使用更广泛的arn吗?像
arn:aws:execute-api:us-east-2:111111:mkvhd2q179/*
您能确认您的自定义授权人在其方法请求中与资源相关联吗?在这之后您是否部署了API?您能否在代码中记录请求和生成的策略文档,以便在调用API时确认是否调用了Lambda(通过检查您是否在CloudWatch中看到日志)?
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:xxxxx:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"xx.xx.xx.xxx/24"
]
}
}
}
]
}
{
"principalId": "xxxxxxxxxx",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:xxxxx:bxxxx/*/POST/*/someresource"
]
}
]
}
}