AWS API Gateway会忽略自定义授权方Lambda函数返回的身份验证策略

时间:2019-04-17 12:21:21

标签: amazon-web-services aws-lambda aws-api-gateway amazon-cognito lambda-authorizer

我正在尝试在API网关上实现自定义授权,该授权将通过从DynamoDB中读取用户对每个特定端点的权限进行检查。

我将授权者与相关方法相关联(下面的屏幕截图) enter image description here

授权者似乎工作正常,并且返回对我来说看起来很好的策略(请看下面)

{
    "policyDocument" : {
        "Version" : "2012-10-17",
        "Statement" : [
            {
                "Action" : "execute-api:Invoke",
                "Effect" : "Deny",
                "Resource" : "arn:aws:execute-api:us-east-2:111111111111:mkvhd2q179/*/GET/api/Test"
            }
        ]
    },
    "principalId"    : "*"
}

但是,无论策略文档中返回的是哪个Effect授权者,API Gateway仍然会让所有请求通过。我从下面的API端点获取状态200以及结果集。

关于API网关为何会忽略该政策的任何想法?

P.S。 在将星号放在此处之前,我尝试使用显式的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; }
}

3 个答案:

答案 0 :(得分:1)

我也有这个问题。原来,从API网关控制台屏幕(例如https://us-west-2.console.aws.amazon.com/apigateway/)发出请求并没有适当地调用授权者。

我猜是因为您的控制台会话具有自己的IAM策略,该策略会干扰授权者策略。

解决方案是在API网关控制台外部手动对端点进行CURL。

此外,进行更改后,请不要忘记部署API!否则您的更改将不会生效:

enter image description here

答案 1 :(得分:0)

TL; DR;删除/更改/检查在网关中设置的“资源策略”。

我有类似的问题。 不知何故,我在网关的资源策略中设置了“允许*对*资源的主要访问”策略,该策略与授权者返回的内容结合在一起。我最终删除了所有资源策略,然后让授权者决定。

答案 2 :(得分:0)

我有一个类似的问题。设置我们的API网关资源策略的方式是允许我们在帐户级别(arn:aws:execute-api:us-east-1:xxxxx:*)中执行任何API。

即使实现了细粒度访问,我们在其中返回的策略仅允许特定条件的API网关资源策略优先。因此,我删除了资源策略并重新部署了API,它允许该特定API并拒绝其他API。或者,您可以根据配置效果和政策声明的方式反之亦然。

初始资源政策:(我已删除并重新部署)

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

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