0

저는 MSAL을 살펴보고 클라이언트 응용 프로그램에서 올바른 방법을 이해하려고합니다. 내 경우에는 사용자를 인증 한 다음 "개인"웹 API 응용 프로그램에 대해 ID 토큰을 사용하고 싶습니다.MSAL : AcquireTokenSilentAsync는 항상 끝점과 상호 작용합니다.

이제 토큰이 유효하고 요청 범위를 충족시킬 수있는 경우 AcquireTokenSilentAsync가 인증 끝점에 대한 추가 호출을 수행하지 않고도 AcqireTokenSilentAsync가 캐시에서 기존 토큰을 재사용한다는 인상을 받았습니다 (사용 가능한 경우). 내 해석과 아마도 그것은 틀리다). 그러나 이것은 그렇지 않습니다. 내가 바이올린으로보고있는 것은이 방법이 항상 인증 엔드 포인트에 액세스한다는 것입니다.

초기에는 인증 토큰 헤더를 통해 백엔드 웹 사이트로 전달되는 ID 토큰을 얻기 위해 내 클라이언트 서비스 래퍼가 항상이 메서드를 사용해야한다고 생각했습니다.

public async Task<string> GetAllWorkers() { 
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetToken()); 

    var request = new HttpRequestMessage(HttpMethod.Get, _url); 
    var resposta = await _httpClient.SendAsync(request); 
    var content = await resposta.Content.ReadAsStringAsync(); 
    return content; 
} 

GetToken가 실패하면 AcquireTokenSilentAsync 배치하는 시도/catch 블록을 사용하여 사용자 (인증에 사용되는 전형적인 코드를 래핑하는 방법으로 사용자를 리디렉션 : 여기서 I의 의미의 예 로그인 UI를 표시하기위한 AcquireTokenAsync 메소드).

질문 : 내 모든 백엔드 서비스가 실제로 갈 길 전에이 추가 호출이 필요합니까? 아니면 내가 401를 얻을 때까지 전화 토큰을 캐시 및 모든 내부 웹 서비스에서 재사용한다 (단 다음은 내 ID 토큰을 새로 고치려면 GetToken 메서드를 호출해야합니까?)

편집이 더 많은 정보를 제공하기 위해

_clientApp = new PublicClientApplication(ClientId, 
             Authority, 
             TokenCacheHelper.GetUserCache()); 

TokenCacheHelper는 Azure AD 샘플과 함께 제공되는 토큰 캐시 도우미입니다.

return (await _helper.AuthenticateUser()).IdToken 

그리고 여기에서 AuthenticateUser 방법 : 이하, 토큰

public async Task<AuthenticationResult> AuthenticateUser() { 
    try { 
     return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault()); 
    } 
    catch (MsalUiRequiredException ex) { 
     return await RetryWithGraphicalUI(); 
    } 
} 

인증 헤더를 반환 GetToken있어서 위에 표시된 _clientApp 필드를 캡슐화 도우미와 상호 작용하는 하나의 라이너 캐시 도우미가 공격 중입니다. 내가 이해할 수없는 것은 AcquireTokenSilentAsync 메서드가 항상 oauth2 끝점 (https://login.microsoftonline.com/ {azure ad guid} /oauth2/v2.0/token)을 호출하는 이유입니다 ...

한편, 내 도우미 클래스가 AuthenticationResult를 캐시합니다. 이제 AcquireTokenSilentAsync는 "내부"앱의 웹 API 메소드 중 하나가 베어러 인증 헤더로 수행 된 호출에 대한 응답으로 401을 반환하는 경우에만 호출됩니다.

+0

응용 프로그램을 초기화하는 권한에 대해 좀 더 알려주십시오. 캐시가 왜 안 맞는지 이해하고 싶습니다. –

+0

안녕하세요 Jean-Marc. UI가 표시되지 않기 때문에 캐시에 기록되지만 acquiretokensilentasync는 항상 인증 엔드 포인트를 호출하여 토큰을 가져옵니다. 더 많은 코드를 보여 주시겠습니까? –

+0

PublicClientApplication의 생성자 (공용 클라이언트 응용 프로그램이라고 가정 함). 공통 종점에 도달합니까? MSA (Microsoft 개인 계정) 인 ID를 사용하고 있습니까? 또는 AAD 중 하나? –

답변

1

결국 AuthenticationResult를 캐싱하고 ID 토큰을 사용했습니다. 이것은 원격 호출을 저장하기 때문에 가장 좋은 옵션 인 것 같습니다. 웹 서비스가 401을 반환 할 때에 만 AcquireTokenSilentAsync에 다시 전화를 걸도록하겠습니다.

관련 문제