我正在尝试在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 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; }
}
答案 0 :(得分:1)
我也有这个问题。原来,从API网关控制台屏幕(例如https://us-west-2.console.aws.amazon.com/apigateway/)发出请求并没有适当地调用授权者。
我猜是因为您的控制台会话具有自己的IAM策略,该策略会干扰授权者策略。
解决方案是在API网关控制台外部手动对端点进行CURL。
此外,进行更改后,请不要忘记部署API!否则您的更改将不会生效:
答案 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"
]
}
]
}
}