AWS API Gateway игнорирует политику аутентификации, возвращаемую лямбда-функцией пользовательского авторизатора - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь реализовать пользовательскую авторизацию на 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"    : "*"
}

Однако, несмотря на то, что авторизатор эффектов, возвращенный в документе политики, API-шлюз все равно пропускает все запросы.Я получаю статус 200, а также набор результатов из конечной точки API внизу.

Любые идеи о том, почему API-шлюз будет игнорировать политику?

PS Я пытался с явным принципалом PrincipalID (имя пользователя / тема из токена) перед тем, как поставить там звездочку.Он вел себя так же.

PPS Вот полностью недействительная версия моей лямбда-функции, в настоящее время настроенная на всегда возвращать 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; }
}

1 Ответ

0 голосов
/ 05 мая 2019

TL; DR; Удалите / измените / проверьте «Политику ресурсов», установленную в шлюзе.

У меня была похожая проблема. Каким-то образом у меня была политика «разрешить * основной доступ к * ресурсам» в «Политике ресурсов на шлюзе», которая комбинировалась с тем, что возвращал Авторизатор. В итоге я удалил все политики ресурсов и позволил Авторизатору принять решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...