Asp.net Core 2.0 OpenId Connect Handler에 Claims가 없습니까?
텍스트:https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/출시: 2017년 11월 환경: ASP.NET Core 2.0
OIDC provider를 통해 Claims를 Claims Principal에 비추는 절차는 ASP에 있습니다.NET Core 2의 새로운 OpenID Connect handler는 서로 다른 동작을 수행합니다.여기에 몇 개의 부품이 모여 있기 때문에 특히 곤혹스럽고 진단하기 어렵다.한번 봅시다.내 예제 OIDC 클라이언트를 사용하여 동일한 결과를 확인할 수 있습니다.
Microsoft 전용 claim 유형에 표준 claim 유형 매핑
마이크로소프트가 여전히 당신에게 가장 적합한 것이 무엇인지 알고 있다고 생각하고 OIDC 표준 성명을 자신의 전문 성명에 비추는 것이 고민이다.Microsoft JWT 토큰 프로세서에서 인바운드 선언 유형 매핑을 제거하여 다음과 같이 고칠 수 있습니다.
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
기본 OpenId Connect 인증 요청
다음은 클라이언트가 Openid scope를 요청하는 장면부터 시작합니다.우선 당혹스러운 것은 마이크로소프트가 Openid와 프로필 scope를 사용하여 OpenIdConnectOptions에 Scope 집합을 미리 채웠다는 것이다.이것은 Openid만 요청하려면 먼저 Scope 집합을 지우고 수동으로 Openid를 추가해야 한다는 것을 의미합니다.
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.AccessDeniedPath = "/account/denied";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://demo.identityserver.io";
options.ClientId = "server.hybrid";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.Scope.Clear();
options.Scope.Add("openid");
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
ASP를 사용합니다.NET Core v1 프로세서, nbf,exp,iss,aud,nonce,iat,chash,sid,sub,auth_time,idp,amr.
V2에서 우리는sid,sub,idp만 얻을 수 있다.무슨 일이 있었죠?
Microsoft는 OpenID Connect handler에 ClaimActions라는 새로운 개념을 추가했습니다.Claim actions는 외부provider의 Claim을 Claims Principal에 비추는 방법을 사용합니다.OpenIdConnectOptions의 구조 함수를 보면 기본적으로 다음 선언이 생략됩니다.
ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
ClaimActions.DeleteClaim("amr");
ClaimActions.DeleteClaim("iss");
ClaimActions.DeleteClaim("iat");
ClaimActions.DeleteClaim("nbf");
ClaimActions.DeleteClaim("exp");
ClaimActions.DeleteClaim("at_hash");
ClaimActions.DeleteClaim("c_hash");
ClaimActions.DeleteClaim("auth_time");
ClaimActions.DeleteClaim("ipaddr");
ClaimActions.DeleteClaim("platf");
ClaimActions.DeleteClaim("ver");
어떤 성명을 '취소' 하려면,handler를 설정할 때 특정한 성명을 삭제해야 합니다.다음은 amr 선언을 가져오는 매우 직관적인 구문입니다.
options.ClaimActions.Remove("amr");
OIDC provider에서 더 많은 Claim 요청
더 많은 범위를 요구할 때, 예를 들어 개인 자료나 사용자 정의 범위가 더 많은 클레임을 초래하고, 또 다른 곤혹스러운 세부 사항은 주의해야 한다.OIDC 프로토콜에 의한responsetype, 일부 성명 통과 idtoken은 전송되며, 일부는 사용자 info 단점을 통해 전송됩니다.나는 여기에 이 세부 사항에 관한 문장을 썼다.따라서 먼저 사용자 info 엔드포인트에 대한 지원을 프로세서에서 활성화해야 합니다.
options.GetClaimsFromUserInfoEndpoint = true;
사용자 info에서 성명이 되돌아오면, ClaimsActions는 되돌아오는 JSON 문서에서 Claim을 principal로 비추는 데 사용됩니다.기본 설정은 다음과 같습니다.
ClaimActions.MapUniqueJsonKey("sub", "sub");
ClaimActions.MapUniqueJsonKey("name", "name");
ClaimActions.MapUniqueJsonKey("given_name", "given_name");
ClaimActions.MapUniqueJsonKey("family_name", "family_name");
ClaimActions.MapUniqueJsonKey("profile", "profile");
ClaimActions.MapUniqueJsonKey("email", "email");
고객에게 상기 목록에 속하지 않는claim을 보내면 무시됩니다. 명확한 맵이 필요합니다.예를 들어, 클라이언트가 userinfo(표준 OIDC 선언 중 하나이지만 Microsoft에서 매핑하지 않음)를 통해 웹사이트 claim을 가져오려면 스스로 매핑을 추가해야 합니다.
options.ClaimActions.MapUniqueJsonKey("website", "website");
이것은 사용자 info를 통해 되돌아오는 다른 성명에도 적용됩니다.
나는 이것이 도움이 되기를 바란다.간단히 말해서 - 기본 맵이 바뀔 수 있다고 믿기 때문에 클라이언트 프로그램에 의외의 행동을 일으킬 수 있다는 것을 분명히 알아야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.