2016-06-06 18 views
4

Ich habe eine Web API und Mvc 5 für dasselbe Projekt. Das Web Api ist mit Inhaber Token geschützt (aber ich bemerkte die SuppressDefaultHostAuthentication Linie, so kann ich die api von Browser zugreifen, wenn ich mit Cookie mvc authentifiziert bin)Rufen Sie eine Web-API von MVC-Controller (Cookie-Authentifizierung)

Jetzt bin ich versucht, die api von einem Mvc-Controller für den Zugriff auf ohne das Token zu senden, ist das mit SuppressDefaultHostAuthentication möglich?

Versuchte, dass ohne Erfolg (401 Fehler):

HttpClientHandler handler = new HttpClientHandler() 
{ 
    PreAuthenticate = true, 
    UseDefaultCredentials = true 
}; 

using (var client = new HttpClient(handler)) 
{ 
    client.BaseAddress = new Uri("http://localhost:11374/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    var response = client.GetAsync("api/MyApi").Result; 
    if (response.IsSuccessStatusCode) 
    { } 
}  

Wenn es nicht möglich ist, wie der beste Weg, um dieses Problem zu umgehen?

Antwort

3

WebApi hält sich an REST, was unter anderem vorschreibt, dass Anfragen zustandslos sind. Das bedeutet, dass es bei WebApi oder einer REST-kompatiblen API kein Konzept wie Cookies, Sitzungen usw. gibt. Jede Anfrage an die API muss Informationen enthalten, die zur Bearbeitung der Anfrage benötigt werden. Wenn Sie über einen Endpunkt verfügen, für den eine Authentifizierung erforderlich ist, müssen Sie daher authentifizieren, damit die Anforderung darauf zugreifen kann. Zeitraum. Wenn Sie Authentifizierung über Bearer-Token durchführen, müssen Sie das Bearer-Token übergeben.

2

Da die WebAPI und der MVC-app im selben Projekt sind Sie brauchen, um über HTTP nicht zu gehen und einen Antrag, um ein Verfahren eines jeden machen zugreifen - sie sind Nachbarn :)

Sie kann die WebAPI als normale Klasse behandeln und sie im MVC-Controller instanziieren. Anschließend rufen Sie die Methoden der Instanz wie bei jedem anderen Objekt in Ihrer Anwendung auf.

Es ist jedoch nicht möglich, Tokens und/oder andere Sicherheitsmechanismen zu vermeiden, für die die WebAPI entwickelt wurde, wenn Sie eine Anfrage über HTTP nutzen, um darauf zuzugreifen.

+0

Technisch gesehen könnte das funktionieren, aber nur, weil ein Controller wie eine reguläre Klasse instanziiert wird (statt die Request-Pipeline zu durchlaufen) einige Attribute wie 'Authorize' umgeht (da es im Kontext der Request-Pipeline funktioniert) . Wenn Sie es auf diese Weise tun, werden Sie jedoch Probleme bekommen, wenn Sie sich auf die Authentifizierung (d. H. "Benutzer") in der Aktion verlassen. –

+5

Es wäre viel besser, den Code in den Web-API-Aktionen in eine Klassenbibliothek herauszufiltern, die dann sowohl das Web-API- als auch das MVC-Projekt nutzen kann, anstatt zu versuchen, die Web-API direkt außerhalb der Anforderungs-Pipeline zu verwenden. –