0

Ich habe eine Multi-Tenant-Web-API erstellt, die gut funktioniert. Jetzt möchte ich einen nativen Client zum Testen erstellen. Die Web-API-App ist in einem Mandanten definiert. Die Test-App ist in einem anderen Mandanten definiert, der der Web-API die Zustimmung des Administrators erteilt hat.Wie kann ich eine mit Azure AD geschützte Web-API mit dem Visual Studio Test Adapter testen?

Ich mag die native App verwenden, um mit Benutzername und Passwort in meinen (nicht interaktiv) Integrationstests zu authentifizieren. Ich kann keine Zertifikats-/Nur-App-Authentifizierung verwenden, da ich einen echten Benutzerkontext benötige.

Erste ein Token

var userCredential = new UserCredential("[email protected]", "password"); 
var context = new AuthenticationContext("https://login.windows.net/common"); 

return context.AcquireToken("https://webapitenant.onmicrosoft.com/webApiResourceUri", testClientId, userCredential).AccessToken; 

Das Problem mit diesem Code ist, dass es nicht funktioniert, bis ich Admin-Zustimmung zu der nativen App gegeben habe, auch wenn der Benutzer in dem gleichen Mieter ist wie die App-Registrierung.

Exception geworfen:

'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException' in Microsoft.IdentityModel.Clients.ActiveDirectory.dll 

Additional information: 
AADSTS65001: The user or administrator has not consented to use the application with ID 'nativeclientid'. Send an interactive authorization request for this user and resource. 

Da Tests nicht interaktiv sind Ich habe eine Konsolenanwendung erstellen, die den obigen Code verwendet, aber mit PromptBehaviour.Always. Dies wird mich nach Benutzername und Passwort fragen und ein Einverständnisformular anzeigen. Nachdem ich zugestimmt habe, funktionieren die Tests, die die native App-Registrierung verwenden, ebenfalls.

Gibt es eine Möglichkeit, die Zustimmung Form ohne interaktiven GUI zu akzeptieren?

Antwort

2

Im Moment gibt es keine andere Möglichkeit, die Einwilligung der Nutzer ohne irgendeine Art von Benutzererfahrung zu schreiben. (Was Sinn macht richtig?)

Wenn Sie das Azure Management Portal verwenden, als Administrator Ihrer Mieter, alle Anwendungen, die Sie erstellen automatisch für die Ressourcen zugestimmt werden, die Sie ausgewählt. Dies liegt daran, dass das Azure-Verwaltungsportal diese Zustimmungslinks speziell beim Speichern Ihrer Clientanwendung schreibt.

Wenn Sie andere Portale oder APIs, um die Anwendung zu erstellen, dann müssen Sie die Anwendung mindestens einmal zuzustimmen. Sie müssen nicht unbedingt sofort Verhalten in Ihre Anwendung setzen, um den Zustimmungsbildschirm zu erhalten. Sie können einfach die URL generieren für in Ihre Anmeldung erkennen, die Sie auch durch die Zustimmung Erfahrung nehmen:

https://login.microsoftonline.com/<TenantID>/oauth2/authorize?client_id=<AppID>&response_type=code&redirect_uri=<RedirectURI>&resource=<ResourceURI>&prompt=admin_consent 

Beachten Sie, dass wir eine „prompt = admin_consent“ am Ende hinzugefügt, die für die Anwendung zustimmen wird on- im Namen des ganzen Mieters. Mit dieser Art der Zustimmung müssen Sie es nur einmal pro Anwendung tun, damit es funktioniert.

Ich hoffe, das hilft!

+0

Sind Sie sicher, dass Anwendungen im Portal erstellt werden automatisch zugestimmt? Ich habe den nativen Client im Portal erstellt und wurde noch mit einer Einverständniserklärung aufgefordert. Der Testbenutzer befindet sich im selben Verzeichnis wie die native App. Die Web-API befindet sich jedoch in einem anderen Mandanten. –

+0

Speziell als Administrator wird ja Zustimmung registriert. In der Vergangenheit haben Native Client-Anwendungen keine Zustimmung registriert, aber ich habe gehört, dass dies seither behoben wurde, also sollte es auch mit nativen Clients funktionieren. Schließlich können Sie feststellen, dass Sie in Ihrem Code "Zustimmung einfordern", was den Einwilligungsdialog erzwingt, unabhängig davon, ob Sie bereits zugestimmt haben oder nicht. Lassen Sie mich wissen, wenn Sie dieses Verhalten immer noch erhalten und vielleicht können wir Ihre Erfahrungen von der Website debuggen. –

+0

Wenn ich mich richtig erinnere, funktioniert es wie Sie sagen, solange die Web-API und Native Client im gleichen Mandanten registriert ist.In meinem Fall wollte ich Tests gegen einen Remote-Server durchführen, da es einfacher ist, lokal zu debuggen, als auf VSTS-Build-Ausgaben zu warten und Probleme zu beheben. Der Grund für Apps in separaten Mandanten war, dass Entwickler nur ihre eigene native App in ihren eigenen Mandanten konfigurieren und die Web-API-App in einem gemeinsamen Mandanten teilen sollten. Das Erzwingen des Zustimmungsformulars in der Dummy-Konsolenanwendung war beabsichtigt, da es aufgrund der Ausnahmebedingungsnachricht in der Frage sinnvoll wäre. –

Verwandte Themen