Authentifizierung eines ASP.NET Web API REST Services mit Basic Clear Text

Mit einem Methoden Attribut, lässt sich ein kompletter REST ASP.NET Web Api Controller oder explizit eine CRUD Methode vor unerlaubten Zugriff schützen.

   1:    <Authorize(Roles:="Benutzer")>
   2:      Function GetDriveMappings() As IQueryable(Of DriveMappings)

Dabei wird nur geprüft ob die Rechte des angemeldeten (authenticated) Users ausreichen.

Um die Benutzer Anmeldung abzuhandeln kann man sich der eingebauten Methoden (Modules) des IIS bedienen. Per web.config wird eingestellt, das die Windows Benutzerdatenbank verwendet wird, um die Konten zu verwalten.

   1:    <authentication mode="Windows"></authentication>
 

In einem anderen Blog Artikel habe ich gezeigt, wie man den Membership Provider statt dessen  als Benutzer Datenbank verwendet.

Wenn ein Browser einen geschützte Seite anfordert, antwortet der Server mit einer 401 Statusmeldung und liefert im Header das gewünschte Authentifizierungsverfahren mit. Es braucht also intern zwei Requests und eine Benutzereingabe von User und Passwort um die gewünschte Seite zu bekommen.

image

Für einen Service Aufruf ist das ungeeignet. Man muss die Credentials schon beim Initialen Request mitgeben. Wie das auszusehen hat, kann man gut erkennen, wenn man per Fiddler den zweiten, erfolgreich authentifizierten Request, betrachtet.

image

Benutzer und Passwort werden im HTTP Header Base 64 codiert mitgeliefert, getrennt durch einen Doppelpunkt. Hier wurde einfach der Header aus dem Web Request kopiert. Es gibt auch Online Base64 En-Decoder. In der Praxis wird man dafür ein wenig .net code verwenden.

   1:  Dim encodedText = Convert.ToBase64String(Encoding.UTF8.GetBytes("demo" + ":" + "demo"))

Um diesen Basic authentication String aus einer WinRT Anwendung per HTTP Request mitzugeben, greift man direkt in den HTTP Header des HTTPClients ein.

   1:  Dim http As New HttpClient()
   2:  http.DefaultRequestHeaders.Authorization =
   3:         New Headers.AuthenticationHeaderValue("Basic", "ZGVtbzpkZW1v")
   4:  Dim jsondata =
   5:        Await http.GetStringAsync(New Uri("http://localhost.fiddler:27536/api/DriveMappings/"))

Wenn alles gut geht, sollte Fiddler dann einen 200 Code anzeigen. Hinweis: immer https anschalten. Basic Clear Text heißt nicht umsonst so.

Murphy

Es gibt allerdings eine Menge Dinge die dabei schief laufen können. Wenn man IISExpress verwendet, muss Basic Authentifizierung erst aktiviert werden. In den Einstellungen in Visual Studio sucht man das vergeblich.

image

Im IIS 7 wird die Authentifizierung über ein User Interface eingestellt. Beim Express muss man direkt in die applicationhost.config Datei. Diese findet man unter C:\Users\USER\Documents\IISExpress. Dort im Bereich authorization

   1:  <authentication>
   2:        <anonymousAuthentication enabled="true" userName="" />
   3:         <basicAuthentication enabled="true" /> 

Fiddlertipp

Um den Traffic bei Win8 RT (Modern UI, METRO) Apps mitzubekommen muss man in den Fiddler WIn8 Settings die APP erlauben und nicht localhost verwenden.( Zeile 5 HTTPClient Sample)

Pingbacks and trackbacks (1)+

Kommentare sind geschlossen