2016-12-12 1 views
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 (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."} 

Antwort

0

Bitte stellen Sie sicher, dass der Web-App ist ignorieren das Thema Validierung und das Publikum gleiche wie die Ressource (https://webapi.onmicrosoft.com/appuri", "testappid) Sie für den Zugriff erwerben Token und dieser Wert soll die App-ID URI das Sie sich auf old Azure portal wie Abbildung unten finden:

enter image description here

Hier ist der relative Code für die Authentifizierung o für die Einstellung f Multi-Tenant-Web-API:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
       new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
       { 
        Audience = ConfigurationManager.AppSettings["ida:Audience"], 
        Tenant = ConfigurationManager.AppSettings["ida:Tenant"], 
        TokenValidationParameters= new System.IdentityModel.Tokens.TokenValidationParameters { 
         ValidateIssuer=false 
        } 
       }); 
+0

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. –

+0

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. –

+0

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 –

Verwandte Themen