繁体   English   中英

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

[英]AWS API Gateway ignores auth policy returned from the Custom Authorizer Lambda Function

我正在尝试在 API 网关上实现自定义授权,这将通过从 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 网关仍然让所有请求通过。 我从下面的 API 端点获得状态 200 和结果集。

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

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

PPS 这是我的 Lambda 函数的完全简化版本,目前设置为始终返回拒绝作为策略效果......

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; }
}

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

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

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

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

解决方案是在 API 网关控制台之外手动卷曲端点。

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

在此处输入图像描述

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

即使实现了细粒度访问,我们返回一个策略以仅允许特定的 arn API 网关资源策略优先。 因此,我删除了资源策略并重新部署了 API,它允许该特定 API 并拒绝其他 API。 或者你可以根据你如何配置 Effect 和 policy 语句来尝试反之亦然。

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

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

AWS 文档令人困惑……看来您仍然需要使用“回调”来解决问题,并且不足以返回“拒绝”策略……

exports.authorizer = (event, context, callback) => {

  if (invalidToken) {
    callback("Unauthorized", null);
  }

  // create a valid policy

  return validPolicy
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM