ASP.NET Web API 302

Nach dem einfügen eines Authorize Methoden Attributes vor eine ASP.NET Web API Controller Methode, kann nur mehr ein angemeldeter Benutzer diese nutzen.  ASP.NET MVC und ASP.NET Web API müssen an dieser Stelle zwei unterschiedliche Anwendungsfälle abdecken. Bei einer UI gesteuerten Anwendung wird der Benutzer bei Aufruf einer geschützten Seite zur Login Seite umgeleitet. Bei einem Service soll eine 401 HTTP Meldung gesendet werden.

Die Implementierung des AuthorizeAttribut Klasse fand sich in der Vergangenheit in zwei Unterschiedlichen Assemblies. System.Web.MVC und System.Web.Http. Etwas was in vielen Foren Einträgen immer wieder diskutiert wird.

Allerdings reagiert ein von mir erstellte REST Service anders wie erwartet. Es wurde mit Visual Studio 2013 ein Web Projekt angelegt und Web API und Web Forms angehakt.

Ein Testservice liefert nun eine HTTP 302 Meldung statt der erwarteten 401. Nur aus  dem HTML Body Text erkennt man das Problem {"Message":"Authorization has been denied for this request."}

image

Das ist für eine Auswertung des AJAX Request per JavaScript Framework (zb AngularJS) wenig geeignet.

Die Ursache liegt in der Verwendung der OWIN Klassen. Mehr unabsichtlich als wissentlich. Jedenfalls kann man das Verhalten in der Datei Startup.Auth.vb erkennen und auch verändern.  Es wird Zeile 7-10 eingefügt. Damit wird geprüft ob es sich um einen REST API Aufruf handelt. Nur wenn nicht, wird der Redirect auf die Login Seite durchgeführt.

   1:  Public Sub ConfigureAuth(app As IAppBuilder)
   2:  ....
   3: ' Enable the application to use a cookie to store information for the signed in user
   4:   app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
   5:     .AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
   6:      .Provider = New CookieAuthenticationProvider() With {
   7:          .OnApplyRedirect = Sub(x)
   8:                          If x.Request.Uri.AbsoluteUri.Contains("/api/") = False Then
   9:                             x.Response.Redirect(x.RedirectUri)
  10:                          End If
  11:                   End Sub,

 

Der HTTP Request in Fiddler dargestellt zeigt nun das erwartete Ergebnis eine 401 unauthorized Meldung.

image

Obiger Code ist rein konzeptionell zu verstehen und deckt sicher nicht alle Anwendungsfälle ab.

Kommentare sind geschlossen