Hier ist der Kontext meines Problems: Ich entwickle eine Windows Store-Anwendung, die auf mehrere Tablets geladen wird, die unser Client verwenden möchte. Diese Tablet-App ruft eine Web-API auf, die wiederum CRUD-Vorgänge mit einem Repository durchführt (SQL Server über EntityFramework). Alles muss Windows-Authentifizierung verwenden. Die Tablets sind Dell, auf denen Windows 10 ausgeführt wird. Jeder Benutzer meldet sich mit seinen eigenen Anmeldeinformationen für die aktive Domäne an. Das Tablet übermittelt die Anmeldeinformationen an die Web-API, die diese wiederum an das Repository (Datenbank) weitergibt. Auf der Grundlage der Anmeldeinformationen bestimmt das Repository die Gruppe, zu der der Benutzer gehört, und basierend darauf wird der Zugriff auf Ressourcen gewährt, auf die der Benutzer zugreifen darf.Verwenden der Windows-Authentifizierung zum Aufrufen einer Web-API aus einer Windows Store-Anwendung
Meine Web-API funktioniert gut. Ich habe es mit Fiddler getestet. Für die HTTP-GET-Anfrage, die ich testen möchte, habe ich das Kontrollkästchen "Automatisch authentifizieren" aktiviert und kann die drei aufeinander folgenden Nachrichten sehen, wobei die ersten beiden mit 401 und der dritte zurückkehrende HTTP-Code 200 zusammen mit den angeforderten Daten angezeigt werden.
Wenn ich jedoch versuche, es aus meiner Windows Store App aufzurufen, sende ich nur eine GET-Anfrage, die erste. Meine Web-API wird in IIS Express gehostet. Auf Anraten eines sehr unterschiedlichen Mitglieds dieser Gruppe habe ich IIS Express so konfiguriert, dass die Web-API unter Verwendung der IP-Adresse meines Entwicklungscomputers und nicht von "localhost" verfügbar gemacht wird. Bevor ich dies tun würde, würde ich keine GET-Anfragen sehen, die den Server treffen, nicht einmal den ersten.
Ich weiß, dass Windows-Authentifizierung das NTLM-Schema verwendet und es erfordert einen Aushandlungsprozess, daher die 3 Nachrichten, die Fiddler anfänglich an den Server sendet?
Wie muss ich meinen Web API Client-Code schreiben, um diese Verhandlung zu umgehen? Ich habe den ganzen Vormittag und Nachmittag damit verbracht, Lösungen für mein Problem zu lesen, hier auf SO und vielen anderen Webseiten, aber irgendwie habe ich es immer noch nicht zum Laufen gebracht. Ich muss etwas vermissen und ich weiß nicht was. Hier ist mein Code auf der Web-API-Client-Seite:
var authHandler = new HttpClientHandler()
{
Credentials = CredentialCache.DefaultNetworkCredentials,
ClientCertificateOptions = ClientCertificateOption.Automatic
};
var webApiClient = new HttpClient(authHandler)
{
BaseAddress = new Uri(_serviceUri), // _serviceUri is a string that looks like this "http://10.120.5.201:53045"
};
webApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await webApiClient.GetAsync("api/user");
Mein Anruf nie wieder von GetAsync, aber in Fiddler, kann ich sehen, nur die ersten GET-Anfragen an den Server gesendet werden. Wie kann ich meinen Client dazu bringen, hinter den Kulissen zu arbeiten, genau wie Fiddler, und die anderen beiden Nachrichten so zu senden, dass der dritte schließlich mit einer Antwort HTTP 200 Code und mit den Daten, die ich in Fiddler erhalte, zurückkommt?
Wenn mir jemand in die richtige Richtung zeigen kann, wäre ich sehr dankbar.