1

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에서 JwtBearerEventsOnTokenValidated 부분 청구 변환 후크 수 here 알았다. 불행히도, 다른 미지의 미들웨어가 덮어 쓰여진 MyClaimsPrincipal입니다. 어떻게 작동하는지 궁금해합니다.

답변

2

ClaimsTransformer에서 다음과 같은 확인을 사용하여 익명 액세스를 테스트 할 수 있습니다.

if (!IsAnonymousAccessAllowed && context.Principal.Identity.IsAuthenticated) { /* ... */ } 

(이 코드는 MVC5 프로젝트에서, 나는이 또한 희망 : AnonymousClaimsPrincipal

ClaimsPrincipal AnonymousClaimsPrincipal => new ClaimsPrincipal(
    (IIdentity) new ClaimsIdentity(
     (IEnumerable<Claim>) new List<Claim>() { 
      new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "") 
     } 
    ) 
); 

로 변경 익명 액세스에 변환을 건너 뛸 수있는 ClaimsTransformer의 논리와

using System.Security.Claims; 
using System.Web; 
using System.Web.Security; 

private bool IsAnonymousAccessAllowed => UrlAuthorizationModule.CheckUrlAccessForPrincipal(
    HttpContext.Current.Request.Path, 
    AnonymousClaimsPrincipal, 
    HttpContext.Current.Request.RequestType 
); 

.net 코어에서 작동합니다.)

+0

이것은 유용합니다 ..하지만 실제로 h에 가장 적합한 장소를 찾았습니다. 거기에 내 자신의'ClaimsPrincipal'을 만들 수는 없지만, 추가 데이터를 – Learner

+1

@Learner에 첨부하기 위해 자신의'ClaimsIdentity'를 만들려고합니다. 여러분은 ClaimsPrincipal에 쉽게 확장 메서드를 추가 할 수 있습니다. 자신의 Identity 클래스를 제공하는 대신 ClaimsIdentity를 사용합니다. – quetzalcoatl

+0

@Quetzalcoatl하지만 추가 요구뿐만 아니라 완벽한 객체를 첨부하여 자신의 ID를 만들고이를 Identities에 추가 한 다음이 객체에 대한 검사를 수행했습니다. 권한 핸들러 – Learner