2

DynamoDB から読み取って、その背後にある特定のエンドポイントごとにユーザーのアクセス許可をチェックする、API Gateway にカスタム認証を実装しようとしています。

オーソライザーを問題のメソッドに関連付けました (下のスクリーンショット) ここに画像の説明を入力

オーソライザーは正常に動作しているようで、問題ないように見えるポリシーを返します (下を見てください)。

{
    "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 Gateway がポリシーを無視する理由について何か考えはありますか?

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

3 に答える 3

1

私もこの問題を抱えていました。API Gateway コンソール画面 (例: https://us-west-2.console.aws.amazon.com/apigateway/ ) からリクエストを行うと、オーソライザーが適切に呼び出されないことが判明しました。

コンソール セッションに独自の IAM ポリシーがあり、オーソライザー ポリシーに干渉するためだと思います。

解決策は、API Gateway コンソールの外部でエンドポイントを手動で CURL することでした。

さらに、変更を加えた後は、忘れずに API をデプロイしてください! そうしないと、変更が有効になりません。

ここに画像の説明を入力

于 2020-08-25T16:18:18.287 に答える