Sie sind hier: Weblog

Passive Authentifizierungs-Middleware mit OWIN/Katana entwickeln

Foto ,
01.09.2013 22:57:00

Das unter [1] gezeigte Beispiel zur Implementierung einer OWIN/Katana-basierte Middleware-Komponente für eine Authentifizierung via HTTP BASIC kann auch zur Demonstration der Funktionsweise von passiven Authentifizierungs-Middleware-Komponenten verwendet werden.  Dazu ist die Middleware lediglich unter Angabe von AuthenticationMode.Passive zu registrieren:

RegisterHttpBasicAuthMiddleware(app, AuthenticationMode.Passive);

Dies bewirkt, dass die Methode AuthenticateCoreAsync nicht mehr im Zuge der Anfrage angestoßen wird, wie es im aktiven Modus der Fall ist. Vielmehr liegt es nun an der Web-Anwendung, die Authentifizierung manuell zur Ausführung zu bringen.
Ein Web-API-basierter Controller könnte dies zum Beispiel wie im nachfolgenden Listing bewerkstelligen. Dabei ist zu beachten, dass an AuthenticateAsync der authenticationType, unter dem die Authentication-Middleware registriert wurde, zu übergeben ist. AuthenticateAsync sucht nach dem damit assoziierten Handler und bringt dessen Methode AuthenticateCoreAsync zur Ausführung.
Somit kann man im Rahmen der Ausführung von Routinen entscheiden, ob eine Authentifizierung notwendig ist und trotzdem die vorhandenen Middleware-Komponenten Framework-übergreifend einsetzen. Das Wissen darüber hilft auch beim Verständnis für den aktiven und passiven Modus, mit welchem man zum Beispiel beim Einsatz der neuen OWN/Katana-basierten Forms-Authentication zwangsweise zu tun hat.
public class SecurePassiveController: ApiController
{
    public async Task<string> Get()
    {
        IIdentity currentIdentity = null;

        var authResult = await Request
                                .GetOwinContext()
                                .Authentication
                                .AuthenticateAsync("BASIC");

        if (authResult == null || authResult.Identity == null) 
                 throw new HttpResponseException(HttpStatusCode.Unauthorized);

        return authResult.Identity.Name;
    }
}