2017-11-03 11 views
0

웹상의 많은 게시물을 읽은 후에 분실되었으며 몇 가지 조언이 필요합니다. Xamarin.Forms 프로젝트에서 ADAL 3.17.1을 사용합니다. 이제 ADAL3에서는 새로 고침 토큰과 AcquireTokenByRefreshTokenAsync를 더 이상 사용할 수 없으며 내부적으로 처리됩니다. 하지만 메모리에 저장된이 새로 고침 토큰은 IOS 앱이 백그라운드에서 실행되거나 응용 프로그램이 닫히고 다시 열릴 때 다시 로그온해야합니다.ADAL 3 토큰 지속성

아침에 사용자 로그를 기록하고 토큰을 8-10 시간 동안 유효하게 유지할 수 있습니까? 다음 8-10 시간 내에 앱을 시작하거나 다시 시작할 때 로그인하지 않으시겠습니까? 나는 그것에 대한 게시물을 찾을 수 없습니다. 새 캐시를 초기화하는 것처럼

public class Authenticator_iOS : IAuthenticator 
 
    { 
 
     public async Task<MultipleAuthResult> Authenticate(string authority, string resource, string resource2, string clientId, string returnUri) 
 
     { 
 
      MultipleAuthResult multipleAuth = new MultipleAuthResult(); 
 

 
      var authContext = new AuthenticationContext(authority, new CustomTokenCache()); 
 
      if (authContext.TokenCache.ReadItems().Any()) 
 
       authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority); 
 

 
      var controller = UIApplication.SharedApplication.KeyWindow.RootViewController; 
 
      var uri = new Uri(returnUri); 
 
      var platformParams = new PlatformParameters(controller); 
 
      platformParams.PromptBehavior = PromptBehavior.Auto; 
 
      
 

 
      try 
 
      { 
 
       multipleAuth.ResultBackEnd = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);  // Token for backend 
 
       multipleAuth.ResultGraph = await authContext.AcquireTokenAsync(resource2, clientId, uri, platformParams);  // Token for Graph query 
 
      } 
 
      catch (Exception e) 
 
      { 
 
       return null; 
 
      } 
 

 
      return multipleAuth; 
 
     } 
 

 
     public void SingOut(string authority) 
 
     { 
 
      //Token 
 
      var authContext = new AuthenticationContext(authority); 
 
      if (authContext.TokenCache.ReadItems().Any()) 
 
      { 
 
       authContext.TokenCache.Clear(); 
 
      } 
 

 

 
      //Webview cookie 
 
      NSHttpCookieStorage CookieStorage = NSHttpCookieStorage.SharedStorage; 
 
      foreach (var cookie in CookieStorage.Cookies) 
 
      { 
 
        CookieStorage.DeleteCookie(cookie); 
 
      } 
 

 
     } 
 
    }

+0

iOS에는 격리 된 저장소가 있으므로 Xamarin 클래스에서 사용할 수 있어야합니다. 토큰을 얻는 메소드에는 과부하가있어 토큰 캐시 객체를 전달할 수 있습니다 (먼저 격리 저장소에서 작성 및 유지). 토큰은 1 시간 동안 유효합니다. 다음에'.AcquireTokenAsync() '를 호출하면 캐시에서 새로 고침 토큰을 사용하여 UI 토큰없이 새로운 토큰을 얻고 토큰을 새로 고칩니다. – evilSnobu

+0

답장을 보내 주셔서 감사합니다. ADAL3 필요와 같은 Authenticator 클래스를 사용합니다. UWP와 Android에서 "캐시"기능이 잘 작동하지만 IOS는 계속 로그인을 요구합니다. 사용하는 코드로 게시물을 업데이트하십시오. –

답변

0

가 보이는 모든 게시물은 여기에

은 IOS에서 실행 내 인증 자 클래스의 코드는 ... 새로 고침 토큰의 사용에있다 메소드가 실행될 때마다 인스턴스가 생성됩니다. 이 체크 논쟁 렌더링

var authContext = new AuthenticationContext(authority, new CustomTokenCache()); 

:

if (authContext.TokenCache.ReadItems().Any()) 

그냥 모두 CustomTokenCache를 초기화 제거, 나는 그것이 기본적으로 지속됩니다 느끼고있다. 대신 다음을 수행하십시오.

var authContext = new AuthenticationContext(commonAuthority); 

if (authContext.TokenCache.ReadItems().Count() > 0) 
{ 
    authContext = new AuthenticationContext(
     authContext.TokenCache.ReadItems().First().Authority); 
} 
+0

답장을 보내 주셔서 감사합니다. 내 코드를 변경했지만 IOS 응용 프로그램을 닫거나 다시 시작하거나 다시 시작할 때도 동일한 문제가 발생합니다. 그러나 데이터를 Azure로 푸시해야하는 경우 다른 로그인을 보내고이 시간 동안 authContext.TokenCache.ReadItems(). Count()는 컨텍스트를 반환합니다. 나는 IOS11이 보안을 위해 로컬 캐시 대신 AccessToken을 메모리 캐시에 넣는 어딘가에서 (나는 그것을 찾을 수 없다) 읽었다. 이런 식으로 ADAL이 자동으로 처리하는 "새로 고침 토큰"은 응용 프로그램을 닫거나 다시 시작한 후에 손실됩니다. 아직 해결책을 찾지 못했습니다 ... –

+0

Xamarin 지원 계획이 있거나 iOS11에서 ADAL을 묶는 Xamarin 샘플을 찾으십시오. 어쩌면 잡을 수도 있습니다. – evilSnobu

+0

Microsoft의 지원 사례를 여는 후에이 답변을 얻었습니다. Mac OS X의 ADAL에서 Keychain을 직접 지원하지 않습니다. 기본 캐싱 구현은 프로세스의 수명 동안 토큰을 유지하지만 지속되지는 않습니다. 토큰을 유지하려면 ADTokenCacheDelegate를 구현하고 AuthenticationContext 생성시 제공해야합니다. C# Xamarin.IOS 프로젝트의 경우 해당 항목을 찾을 수 없습니다. 어떤 생각? –