API 수준에서 현재 사용자를 인증하기 위해 Identity-Server에서 제공하는 일부 ID 클레임이 있으며 첫 번째 인증 수준으로 사용할 수 있습니다. 그러나 다음 단계에서는 추가 사용 권한 확인을 위해 이러한 클레임이 충분하지 않아 데이터베이스에서 더 많은 데이터를 검색해야합니다.Asp.NET 코어의 특정 요청에 대한 클레임 변환을 피하는 방법
내 생각은 데이터베이스에서 모든 사용 권한을 첨부하는 사용자 지정 ClaimsPrincipal
을 만드는 것이었지만 요청 당 데이터베이스를 두 번 이상 호출하지 않으려했습니다.
app.UseClaimsTransformation(new ClaimsTransformationOptions()
{
Transformer = new MyClaimsTransformer()
});
내 현재의 변환 방법 : : 이미 눈치
public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
if (context.Principal.Identity.IsAuthenticated)
{
var principal = new MyClaimsPrincipal(context.Principal);
principal.Permissions = /* load from db */;
return Task.FromResult<ClaimsPrincipal>(principal);
}
return Task.FromResult(context.Principal);
}
변환을 주장
그래서, 난 내가 그렇게 같은 파이프 라인에 추가하는 Microsoft.AspNetCore.Authentication.IClaimsTransformer
내 자신의 구현을 가지고 생각 메서드는 매번 요청할 때마다 호출됩니다. 그래서 인증 된 사용자가 없거나 인증이 필요하지 않을 때 (AllowAnonymous
의 경우) 데이터베이스를 호출하는 것을 피하고 추가 권한 검사가 필요하지 않은 경우 (이상적으로) 데이터베이스를 제어하려고합니다.
클레임 변환이 Identity Server의 권한 부여 또는 기타 사항에 바인딩되어야한다고 생각하지만 방법은 모릅니다.
이 문제에 대한 의견이 있으십니까? 고맙습니다!
편집가 나는 IdentityServer4.AccessTokenValidation
에서 JwtBearerEvents
의 OnTokenValidated
부분 청구 변환 후크 수 here 알았다. 불행히도, 다른 미지의 미들웨어가 덮어 쓰여진 MyClaimsPrincipal
입니다. 어떻게 작동하는지 궁금해합니다.
이것은 유용합니다 ..하지만 실제로 h에 가장 적합한 장소를 찾았습니다. 거기에 내 자신의'ClaimsPrincipal'을 만들 수는 없지만, 추가 데이터를 – Learner
@Learner에 첨부하기 위해 자신의'ClaimsIdentity'를 만들려고합니다. 여러분은 ClaimsPrincipal에 쉽게 확장 메서드를 추가 할 수 있습니다. 자신의 Identity 클래스를 제공하는 대신 ClaimsIdentity를 사용합니다. – quetzalcoatl
@Quetzalcoatl하지만 추가 요구뿐만 아니라 완벽한 객체를 첨부하여 자신의 ID를 만들고이를 Identities에 추가 한 다음이 객체에 대한 검사를 수행했습니다. 권한 핸들러 – Learner