0

AzureAD 인증 흐름을 기존 프로젝트에 통합해야합니다. 그래서 샘플 코드는 here에 있습니다. 기본적으로 두 개의 웹 프로젝트가 포함되어 있습니다. 클라이언트 및 웹 API로 서버로 MVC 프로젝트.Azure AD 다른 수의 클라이언트 및 서버 클레임

로그인 한 사용자를 고유하게 식별하기 위해 JWT 토큰에서 "upn"클레임을 사용합니다. 샘플 코드를 실행하여 Azure AD에서 사용자를 인증 할 수있었습니다. 내가 jwt.io에서 AAD의 액세스 토큰을 검사했을 때 클레임 섹션에 "upn"이 포함되어 있지 않지만 ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn)을 사용하여 클라이언트에서 "upn"을 검색 할 수있었습니다. 이 액세스 토큰을 무기 인증 헤더로 추가하고 웹 API에 전화했습니다. 여기서는 ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn)을 사용하여 "upn"클레임을 검색 할 수 없습니다. 이 소유권 주장에 대한 값은 null입니다. 서버 측에 접속하려면 추가 구성이 필요합니까? 현재로서는 클라이언트 측에서만 upn을 검색 할 수 있습니다.

+0

API 측면에서 인증을 구성한 방법을 보여줄 필요가 있습니다. 가져온 액세스 토큰이 API 용입니까? (즉, 잠재 고객 클레임이 API의 앱 ID URI로 설정 됨) – juunas

+0

@ 주간 예 잠재 고객 값은 API의 AppID URI입니다. Git에서 샘플 프로젝트를 다운로드 받았다. Audience 및 TenantID 키의 web.config 값을 변경했습니다. –

답변

1

문제의 예제 프로젝트는 :

대신 사용자의 ID로, 응용 프로그램의 ID로 웹 API를 호출

가 함께 토큰을 얻을 수 TodoListController 라인 95에서

:

result = await authContext.AcquireTokenAsync(todoListResourceId, clientCredential); 

API 자체를 호출하므로 위임 된 호출이 아니라 앱 전용 호출입니다. 따라서 UPN이 없습니다. 호출 응용 프로그램을 식별하지만 appid 클레임을 찾을 수 있습니다.

확인 API에 위임 호출하게이 다른 예 : 당신이 볼 수있는 토큰을 획득 호출이 매우 다르므로 https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/Controllers/TodoListController.cs

가 :

string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 
AuthenticationContext authContext = new AuthenticationContext(Startup.Authority, new NaiveSessionCache(userObjectID)); 
ClientCredential credential = new ClientCredential(clientId, appKey); 
result = await authContext.AcquireTokenSilentAsync(todoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId)); 

참고 인증 구성도 다르다는 점을 : https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs.

+0

고맙습니다. 작동하는지 여부를 알려줍니다. –

+0

토큰에서 UPN을받을 수 있습니다. 고마워요 –

+0

굉장해! 이제 클라이언트는 토큰 엔드 포인트에 대한 호출 대신 자동으로 토큰 *을 얻습니다. 캐시에서 토큰을 찾지 못하면 실패합니다. 'NaiveSessionCache' 클래스는 단순히 세션에 토큰을 저장합니다. 세션은 기본적으로 메모리에 있습니다. 따라서 어떤 이유로 서버가 다시 시작되면 캐시에 새 토큰을 얻으려면 다시 Azure AD로 리디렉션해야합니다. 좀 더 강력한 솔루션을 원한다면 캐시 클래스를 예를 들어로 바꿔야합니다. DB 저장 공간. – juunas