1

저는 Identity Server v4 (하지만 v3과 동일하다고 생각합니다) 및 .NET 코어로 게임하고 있습니다.IdentityServer, Claims and Roles

지금 당장은 내가 이해할 수없는 이상한 문제가 있습니다.

내 MVC 응용 프로그램에서 내 컨트롤러/동작을 보호하기 위해 [Authorize (Roles = "Geek")] 을 사용합니다. HttpContext에서 현재 사용자를 볼 때 모든 역할은 역할이 아닌 클레임으로 사용할 수 있습니다. 사실 User.IsInRole ("Geek") false를 반환합니다.

또한 인증 특성과 함께 클레임을 사용할 수 없습니다. 왜냐하면 모든 역할이 동일한 키 (물론 "역할")를 사용하여 클레임 컬렉션에 저장되기 때문입니다.

"롤"키를 포함한 모든 소유권 주장을 현재 보안 주체의 역할로 자동으로 사용하는 방법이 있습니까?

"토큰 유효성 검사 이벤트"를 사용했지만 성공하지 못했습니다. 내 코드는 다음과 https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/MVC%20and%20API

어떤 힌트 꽤 동일하므로

나는, 샘플의 repo를 시도하고있다?

답변

1

역할 클레임의 "유형"속성 값이 "role"이거나 "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"과 같은 URI입니까? URI가 아닌 "역할"인 경우 설명서에 설명 된대로 InboundClaimTypeMap을 빈 사전으로 설정할 수 있습니다 (클레임 변환 섹션 here 참조). 당신이 당신의 시작 코드에 다음 줄이있는 경우 시도를 제거 : InboundClaimTypeMap 매핑됩니다

JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 

기본값은 일부 JWT는 전체 URI를 사용 System.Security.Claims.ClaimTypes로 주장하고있다. 매핑 된 것 중 하나가 역할입니다.

ClaimsIdentity의 IsInRole 메서드는 RoleClaimType이라는 속성을 사용하여 클레임의 Type 속성과 일치하는 문자열 값을 확인하여 사용 가능한 역할 목록을 찾습니다. 그러면 필요한 역할 텍스트가 일치하는 소유권 주장 목록의 값과 대조됩니다. 기본 ClaimsIdentity는 System.Security.Claims.ClaimTypes.Role을 사용하여 ID에서 역할 클레임을 찾습니다.

앱이 JWT 클레임 유형 구문을 계속 사용하려면 SecurityTokenValidated Notification 이벤트에 새 ClaimsIdentity를 만들어야합니다. ClaimsIdentity 생성자를 사용하면 클레임 역할을 일치시킬 때 사용할 텍스트를 지정할 수 있습니다. 이 경우 텍스트는 "역할"일뿐입니다.