2017-02-27 2 views
0

나는 푸른 색 액티브 디렉토리로 인증하는 azure에서 애플리케이션을 만들기 위해 this resource을 따라 왔습니다. 이 인증 상호 작용의 토큰을 Exchange 및 EWS 관리 API와 함께 사용하여 로그인하지 않고도 조직의 모든 사람을 가장하려고합니다.Azure AD 앱 전용 액세스 토큰 교환

나는 하늘에 우리 조직의 앱을 등록하고 교환 권한을주었습니다. 이것은 EWS 관리와 상호 작용하는 코드를 토큰과 인증서를 만들고 그것으로 우리의 푸른 응용 프로그램을 설정 한 후, 다음 코드를 통해 ADAL를 사용하여 응용 프로그램 전용 액세스 토큰 ...

string authority = "https://login.windows.net/{tenant}/oauth2/authorize"; 
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); 
var certPath = @"C:\path\to\cert\Cert.pfx"; 
var certfile = System.IO.File.OpenRead(certPath); 
var certificateBytes = new byte[certfile.Length]; 
certfile.Read(certificateBytes, 0, (int)certfile.Length); 
var cert = new X509Certificate2(
    certificateBytes, 
    PRIVATE_KEY_PASSWORD, 
    X509KeyStorageFlags.Exportable | 
    X509KeyStorageFlags.MachineKeySet | 
    X509KeyStorageFlags.PersistKeySet); 

ClientAssertionCertificate cac = new ClientAssertionCertificate(CLIENT_ID, cert); 

var token = await authenticationContext.AcquireTokenAsync("https://outlook.office365.com/", cac); 

를 얻을 수 있습니다 API는 다음과 같습니다 ..

ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack; 
_ExchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1) { 
    Credentials = new OAuthCredentials(token), 
    Url = new Uri("https://outlook.office365.com/ews/exchange.asmx"), 
    ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, "[email protected]"), 
}; 

_ExchangeService.HttpHeaders.Add("X-AnchorMailbox", "[email protected]"); 

이 모든 요청은 401 권한이없는 오류를 반환하지만, 관리 API를 통해 가장을 설정하는 올바른 방법이 될 것으로 보인다.

제 질문은 여기까지 나옵니다. 제가 여기서 뭔가 잘못하고있는 것입니까? 아니면 응용 프로그램에 Exchange 서버에 대한 액세스 권한을 부여하기 위해 필요한 다른 것이 있습니까?

내가 수행 한 내용은 고객 동의 흐름을 언급했지만 그 부분의 세부 사항은 분명하지 않습니다. 처음에 동의하라는 메시지를 표시하지 않고 모든 사람에게 내 앱을 허락 할 수 있습니까?

답변

1
그것은 내 옆에 노력하고 있습니다

, 먼저 당신이 푸른 광고에 의해 보호 앱에 사무실에 대한 모든 사서함에 365을 Exchange Online을 응용 프로그램 권한을 모든 권한과 를 사용하여 Exchange 웹 서비스를 설정 한 확인하시기 바랍니다 테스트하려면 다음 코드를 시도하십시오.

 ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2013); 
     exchangeService.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx"); 
     exchangeService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "[email protected]"); 
     exchangeService.HttpHeaders.Add("X-AnchorMailbox", "[email protected]"); 
     exchangeService.TraceEnabled = true; 
     exchangeService.TraceFlags = TraceFlags.All; 
     exchangeService.Credentials = new OAuthCredentials(token.AccessToken); 
     Folder newFolder = new Folder(exchangeService); 
     newFolder.DisplayName = "TestFolder"; 

     newFolder.Save(WellKnownFolderName.Inbox); 

대상 계정의받은 편지함에 새 폴더가 만들어집니다.

+0

이것은 정확히 내가 필요한 것입니다. 방금 응용 프로그램 권한을 적용하는 것을 잊었습니다. 도와 줘서 고마워. – dannylindquist

+0

안녕하세요. 저는 401 번 오류와 마주하고 있습니다. https://stackoverflow.com/questions/45614307/401-unauthorized-while-subscribing-to-push-notifications-with-exchange-service-a 필요한 권한을 부여했습니다. 푸른 포털에 내 애플 리케이션하지만 여전히 행운. – tavier

0

나는 거의 동일한 코드로 작동하는 해결책을 가지고 있습니다.

확인할 수있는 유일한 차이점은 인증 컨텍스트 URL 인 https://login.microsoftonline.com/*tenant-id*입니다.

또한, 나는

new ImpersonatedUserId(ConnectingIdType.SmtpAddress, email); 당신은 [email protected] 전체 로그인 이름, 또는 그냥 전자 메일 주소인지 확인 있습니까 사용할 수 있습니까? enter image description here :

관련 문제