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 (webapitenant
). Die Test-App ist in einem anderen Mandanten (clienttenant
) definiert, der der Web-API die Zustimmung der Administratoren erteilt hat.Wie bekomme ich Zugriffstoken für Web-API aus der nativen App in einem anderen Mandanten?
Ich habe die testClientId
als knownClientApplication
in der Web-API-App-Manifest und oauth2AllowImplicitFlow
aktiviert. Dem Testclient wurden Berechtigungen für die Web-API-App erteilt.
GetAccessToken:
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;
Exception geworfen:'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException' in Microsoft.IdentityModel.Clients.ActiveDirectory.dll
Zusätzliche Informationen: 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.
Exception geworfen:'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException' in Microsoft.IdentityModel.Clients.ActiveDirectory.dll
Zusätzliche Informationen: 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.
aktualisieren Ich habe eine Dummy-Konsolenanwendung eine Einverständniserklärung zu zwingen, die ich akzeptieren könnte. ADAL gibt nun Tokens zurück, aber meine Web-API weist sie zurück (Status 401).
var parameters = new PlatformParameters(PromptBehavior.Always);
var context = new AuthenticationContext("https://login.windows.net/common");
var token = context.AcquireTokenAsync
("https://webapi.onmicrosoft.com/appuri",
"testappid",
new Uri("https://webapi.azurewebsites.net"), parameters).Result.AccessToken;
Console.WriteLine(token); //Output: oauth token
var client = new HttpClient
{
BaseAddress = new Uri("https://webapi.azurewebsites.net/api/")
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = client.GetAsync("tenants").Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
// Output: {"$type":"System.Web.Http.HttpError, System.Web.Http","Message":"Authorization has been denied for this request."}
Meine App ist so konfiguriert. Ich konnte meinen Code nur erhalten, indem ich eine Konsolenanwendung erstellte und PromptBehaviour.Always verwendete. Nach dem Akzeptieren der App begannen meine Integrationstests mit dem Test-Explorer, da sie dieselbe native App wie die Konsolen-App verwendeten. Gibt es eine Möglichkeit, dies zu vermeiden? Offensichtlich kann der Visual Studio Test Runner das Einverständnisformular nicht zeigen. –
Meinten Sie, dass das Token bereits für die Web-API funktioniert? Wenn ich richtig verstanden habe, dass Sie das Test-Runner verwenden, um die von Azure AD geschützte Web-API zu testen, schlage ich vor, dass Sie einen neuen Thread erneut öffnen, damit andere Communitys dieses Problem problemlos erkennen und hilfreiche Antworten erhalten. –
Ich habe eine neue Frage basierend auf meinen aktuellen Ergebnissen und Ihren Kommentaren erstellt. Danke für Ihre Hilfe. http://stackoverflow.com/questions/41146893/how-do-i-test-a-azure-ad-protected-web-api-in-with-visual-studio-test-adapter –