Basic Authentifizierung mit HTTPClient und ASP.NET Web API

In meinem letzten Windows 8 Training, entwickelte sich  das Thema Web Services zum beherrschenden Thema. WCF oder Rest? Welche REST Stack (Web API, Dataservices oder gar RIA Services)? Wie Benutzer anmelden? Wir haben uns dann letztendlich für Basic Authentifizierung entschieden, gesichtet über eine HTTPS Verbindung. Das geht relativ einfach und problemlos und ist sicher.

Wenn man sich dem HTTPClient hingibt, den es jetzt ja auf allen .NET Plattformen gibt, ist das seltsamerweise sehr komplex. Zunächst muss man dem Webserver mitteilen welche Authentifizierungsverfahren er unterstützen soll. Dabei gibt es drei Stellen in die man eingreifen kann. Die zentralen Config Dateien, die Web.Config der Web Anwendung und die Settings in Visual Studio.

Im folgende Beispiel ist Basic Authentifizierung generell erlaubt. In IISExpress SSL und Windows aktiviert

image

In der Web Config <authentication mode="Windows"></authentication>

Eine ASP.NET Web Api Service Methode wird mit dem Authorize Attribut abgesichert.

   1:   <Queryable()>
   2:      <Authorize()>
   3:      Function GetDriveMappings() As IQueryable(Of DriveMappings)

Der erste check ist nun der Aufruf des Services im Browser.

image

Dummerweise klappt das auf anhieb. Warum? Es sollte doch eigentlich nur ein angemeldeter Benutzer möglich sein? Ist er auch. Ein Breakpoint in der Web Api Routine und eine Abfrage von User.Identity.Name offenbart den aktuellen Windows Benutzer. Wie funktioniert das nun?

Der Browser fordert die URL an und der Server antwortet einer 401 Statusmeldung und den möglichen Authentifzierungsverfahren.

authenti1

Hier Basic, NTLM und Negotiate für Kerberos. Der Browser verwendet die für ihn sicherste Methode, braucht aber noch einen zusätzlichen Request um eine verschlüsselte Sicherheitstoken Kommunikation sicher zustellen.

authenti3

Also am Ende drei Requests.

authenti2

Für einen Windows 8 (Modern UI/Metro) Client wird in der Regel nicht automatisch der angemeldet Windows Benutzer verwendet.

Die Hilfsklasse Netzwork Credentials enthält auch eine Eigenschaft UseDefaultCeredentials mit der auf den angemeldete User zurückgegriffen wird.

Im folgenden VB.NET Sample Code Snippet kommt ein Demo User zum Einsatz.

   1:  Dim h As HttpClientHandler = New HttpClientHandler()
   2:  Dim c = New Net.NetworkCredential("demo", "demo")
   3:  h.Credentials = c
   4:  Dim http As New HttpClient(h)
   5:  'http.BaseAddress = New Uri("https://localhost:44301")
   6:  http.BaseAddress = New Uri("http://localhost:27536/") 

Auch hier ist es so, das die Verschlüsselung ausgehandelt wird. Man kann also nicht BASIC erzwingen, außer man schaltet am Webserver “Windows” wieder aus. Nicht zu verwechseln mit dem Eintrag in der Web.Config, der nur darauf hinweist, Windows als Benutzerdatenbank zu verwenden.

image

Der zweite request sendet dann schließlich Username und Passwort mit

image

Nie vergessen, Username: Passwort ist nur Base64 codiert und lässt sich decodieren. Also immer die Kombi Basic und HTTPS verwenden.

Kommentare sind geschlossen