2

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

我将授权人与相关方法相关联(下面的屏幕截图) 在此处输入图像描述

授权人似乎工作正常,它返回的策略对我来说看起来不错(看看下面)

{
    "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 网关为什么会忽略该策略的任何想法?

PS 在放星号之前,我尝试使用显式的 principalID(令牌中的用户名/主题)。它的行为相同。

PPS 这是我的 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; }
}
4

3 回答 3

2

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

我有一个类似的问题。不知何故,我在网关的资源策略中设置了“允许 * 主体访问 * 资源”策略,该策略与授权方返回的任何内容相结合。我最终删除了所有资源策略并让授权人决定。

于 2019-05-04T23:10:00.430 回答
1

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

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

解决方案是在 API Gateway 控制台之外手动 CURL 端点。

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

在此处输入图像描述

于 2020-08-25T16:18:18.287 回答
0

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

尽管实现了细粒度访问,我们返回一个策略以仅允许特定的 arn,但 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"
                ]
            }
        ]
    }
}
于 2019-10-16T17:44:29.070 回答