2016-08-03 24 views
4

Ich habe ein "Test" -Projekt erstellt, in dem ich ein .Net 4.6 WebApi verwende, das ich Authentifizierung mit ADFS integrieren möchte - ähnlich wie this post. Ich rufe die api aus einem Winkel Projekt und mit dem folgenden Code, den ich bin in der Lage, die Authorization-Header zu erhalten:WebApi und ADFS-Integration

 string authority = ConfigurationManager.AppSettings["adfsEndpoint"].ToString(); 
    string resourceURI = "https://localhost:44388/"; 
    string clientID = "someguid"; 
    string clientReturnURI = "http://localhost:55695/"; 

    var ac = new AuthenticationContext(authority, false); 

    //This seems to be working as I am getting a token back after successful authentication 
    var ar = await ac.AcquireTokenAsync(resourceURI, clientID, new Uri(clientReturnURI), new PlatformParameters(PromptBehavior.Auto)); 
    string authHeader = ar.CreateAuthorizationHeader(); 

    //this fails with a 401 
    var client = new HttpClient(); 
    var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:64038/api/Values"); 
    request.Headers.TryAddWithoutValidation("Authorization", authHeader); 
    var response = await client.SendAsync(request); 

    return response ; 

jedoch bei einem späteren Aufruf an meine ValuesController, die das Autorisieren Attribut verwendet, habe ich immer empfange eine 401-Unathorized-Antwort (obwohl ich den Authorization-Header übergebe). Ich bin mir nicht sicher, was ich vermisse.

Eine andere Sache zu beachten: Wenn ich aufgefordert werde, meine Anmeldeinformationen, bekomme ich den Dialog unten und nicht die typische ADFS-Login-Seite, die ich mit meinen normalen MVC-Apps, die Authentifizierung mit ADFS (ich bin mir nicht sicher, warum dies) passiert entweder). enter image description here

Antwort

0

Ugh! Es stellte sich heraus, dass ich dieses Stück Code verpasst, die in der ConfigureAuth Verfahren benötigt wurde:

app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions 
{ 
    Audience = ConfigurationManager.AppSettings["ida:Audience"], 
    MetadataEndpoint = ConfigurationManager.AppSettings["ida:MetadataEndpoint"] 
}); 

Nachdem ich dies gemacht zugegeben, und die notwendigen Konfigurationen in der Datei web.config (und die ResourceURI Variable in die AcquireTokenAsync Methode übergeben Korrektur) konnte ich einen hTTP-Anruf von meinem api Controller an den Werten Controller machen, die mit dem Autorisieren Attribut mit diesem Code aus dem Tutorial eingerichtet wurde:

var client = new HttpClient(); 
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:64038/api/Values"); 
request.Headers.TryAddWithoutValidation("Authorization", authHeader); 
var response = await client.SendAsync(request); 
string responseString = await response.Content.ReadAsStringAsync(); 
return responseString; 

Dies wird immer noch funktionieren nicht für einen AngularJS Client (die Ich verstehe jetzt), also werde ich versuchen, die ADAL JS-Bibliothek dafür zu implementieren.

bearbeiten

Wie sich herausstellt, basierend auf this Antwort, wie es scheint ich nicht in der Lage sein zu tun, was ich hatte gehofft, zu tun (ADFS AngularJS App WebAPI Backend mit On-Premise). Ich habe mich stattdessen für einen MVC-AngularJS-Ansatz entschieden.

Verwandte Themen