Извлечение идентификатора из ответа лямбда-авторизатора
Я сделал собственный лямбда-авторизатор, который проверяет JWT и возвращает Allow
политика.
var context = new APIGatewayCustomAuthorizerContextOutput();
var tokenUse = ExtractClaims(claims, "token_use");
context["tokenType"] = tokenUse;
var response = new APIGatewayCustomAuthorizerResponse
{
PrincipalID = "asd",
PolicyDocument = new APIGatewayCustomAuthorizerPolicy
{
Version = "2012-10-17",
Statement = new List<APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement>()
{
new APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement
{
Action = new HashSet<string>() {"execute-api:Invoke"},
Effect = "Allow",
Resource = new HashSet<string>() {"***"} // resource arn here
}
},
},
Context = context
};
return response;
Теперь мне нужно использовать эту личность на моем сервере ресурсов.
Проблема в том, что утверждения, которые я помещаю в контекст авторизатора, отображаются в authorizer
непосредственно
"authorizer": {
"cognito:groups": "Admin", ...
}
но мой Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
ожидает тех, кто под authorizer.claims
,
вроде такой:
"authorizer": {
"claims": {
"cognito:groups": "Admin", ...
}
}
И я знаю это, потому что он работал, когда я использовал встроенный авторизатор Cognito User Pool, который делал ввод таким образом.
Мне удалось обнаружить, что Lambda Authorizer не разрешено добавлять вложенные объекты в контекст (и проверил, что он выбрасывает authorizer error
если я сделаю.)
Я также обнаружил, что когда APIGatewayProxyFunction
извлекает личность, он смотрит на Authorizer.Claims.
Поэтому мне нужно либо извлечь их на моем сервере ресурсов, минуя Claims
свойство как-то, или добавить вложенный объект в ответ авторизатора, что недопустимо.
Что?
1 ответ
Так что я решил это, переопределив PostCreateContext
метод на моем LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
,
protected override void PostCreateContext(
HostingApplication.Context context,
APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
// handling output from cognito user pool authorizer
if (apiGatewayRequest?.RequestContext?.Authorizer?.Claims != null)
{
var identity = new ClaimsIdentity(apiGatewayRequest.RequestContext.Authorizer.Claims.Select(
entry => new Claim(entry.Key, entry.Value.ToString())), "AuthorizerIdentity");
context.HttpContext.User = new ClaimsPrincipal(identity);
return;
}
// handling output from lambda authorizer
if (apiGatewayRequest?.RequestContext?.Authorizer != null)
{
var identity = new ClaimsIdentity(apiGatewayRequest.RequestContext.Authorizer.Select(
entry => new Claim(entry.Key, entry.Value.ToString())), "AuthorizerIdentity");
context.HttpContext.User = new ClaimsPrincipal(identity);
}
}
Редактировать: также отправил запрос на включение в библиотеку aws-lambda-dotnet, исправляя это.