Amazon web services AWS API网关忽略从自定义授权器Lambda函数返回的身份验证策略

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(令牌中的用户名/主题)

我正在尝试在API网关上实现自定义授权,这将通过从DynamoDB读取用户对其背后每个特定端点的权限来检查用户的权限

我将授权人与所讨论的方法关联(下面的屏幕截图)

授权人似乎工作正常,它返回的策略对我来说很好(查看下面的内容)

然而,不管authorizer在策略文档中返回的效果如何,API网关仍然允许所有请求通过。我从下面的API端点获取状态200以及结果集

关于API网关为什么会忽略该策略,有什么想法吗

附言。 在添加星号之前,我尝试使用显式principalID(令牌中的用户名/主题)。它的表现也一样

p.p.S 这是我的Lambda函数的完全简化版本,当前设置为始终返回Deny作为策略效果

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"
                ]
            }
        ]
    }
}