2017-02-27 3 views
0

Ich habe this resource verfolgt, um eine Anwendung auf azure zu erstellen, die sich mit dem azurblauen aktiven Verzeichnis authentifiziert. Wir möchten das Token aus dieser Authentifizierungsinteraktion mit Austausch und der EWS-verwalteten API verwenden, um sich in unserer Organisation als jedermann zu imitieren, ohne dass sie sich anmelden müssen.Azure AD app-only Zugriffstoken für Identitätswechsel im Wechsel

Ich habe eine App mit unserer Organisation auf azurblau registriert und gab ihm die Erlaubnis zum Austausch. Nach dem Erstellen eines Zertifikats und unsere Azure-Anwendung mit es einrichten, kann ich eine App-only Zugriffstoken erhalten die ADAL über den folgenden Code verwenden ...

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); 

Damit der Code-Token mit den EWS zu interagieren verwaltet API sieht wie folgt aus ..

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]"); 

Dies scheint der richtige Weg, um Identitätswechsel über den verwalteten api einzurichten, wenn jede Anforderung eine 401 unauthorized Fehler zurückgibt.

Meine Frage läuft darauf hinaus, mache ich hier etwas falsch? Oder muss ich noch etwas anderes tun, um meiner Anwendung Zugriff auf den Exchange-Server zu gewähren?

Die article, die ich folgte, erwähnte einen Kundenzustimmungsfluss, aber die Details um diesen Abschnitt sind nicht klar. Kann ich meine App nicht für alle freigeben, ohne sie zunächst um Zustimmung zu bitten?

Antwort

1

Es ist auf meiner Seite funktioniert, wenden Sie sich bitte zunächst bestätigen Sie Verwenden Exchange Web Services mit vollem Zugriff auf alle Postfächer Anwendungsberechtigung für Office 365 Exchange Online zu Ihrer App, die geschützt von Azure AD gesetzt haben: enter image description here Zum Testen können Sie den folgenden Code versuchen:

 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); 

Das erstellt einen neuen Ordner im Posteingang des Zielkontos.

+0

Dies ist genau das, was ich brauchte. Ich hatte gerade vergessen, die Antragserlaubnis zu beantragen. Danke für Ihre Hilfe. – dannylindquist

+0

Hallo, ich habe den gleichen 401 Fehler hier: https://stackoverflow.com/questions/45614307/401-unauthorized-while-subscribing-to-push-notifications-with-exchange-service-a Ich gab die erforderliche Erlaubnis zu Meine App auf azurblauem Portal aber immer noch kein Glück. – tavier

0

Ich habe eine funktionierende Lösung mit fast dem gleichen Code.

Der einzige Unterschied, den ich feststellen kann, ist die Authentifizierungskontext URL, die https://login.microsoftonline.com/*tenant-id* ist.

Auch verwende ich new ImpersonatedUserId(ConnectingIdType.SmtpAddress, email);

Sind Sie sicher, dass [email protected] ist die volle Anmeldenamen, oder ist es nur die E-Mail-Adresse?

Verwandte Themen