Laden...

Suche nach einem Entwurfsmuster zur Authentifizierung in einer WPF-App.

Erstellt von Chronos vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.388 Views
C
Chronos Themenstarter:in
132 Beiträge seit 2008
vor 9 Jahren
Suche nach einem Entwurfsmuster zur Authentifizierung in einer WPF-App.

Hallo,

ich benötige in meiner Anwendung eine Benutzerauthentifizierung.
Da ich sowas jedoch noch nicht umgesetzt habe, würde ich gerne konkret nach einem Entwurfmuster fragen, das für diesen Fall anzuwenden wäre.

Gedacht ist der Login folgendermaßen. In der Anwendung habe ich Aufgaben die eine Authentifizierung benötigt. Wurde die Authentifizierung bereits vorgenommen soll das Ergebnis der Authentifizierung zurück an den Aufrufer gegeben werden und die Anwendung soll die Aufgabe ausführen. Ist noch keine Authentifizierung gemacht worden, soll geschaut werden ob in den UserSettings Credentials (Benutzername, Passwort) hinterlegt wurden, damit damit eine Authentifizierung unternommen werden kann. War der Authentifizierungsversuch erfolgreich, so wird das Ergebnis der Authentifizierung an den Aufrufer zurück gegeben. War die Authentifizierung jedoch nicht erfolgreich oder wurden keine Credentials hinterlegt soll eine Dialog geöffnet werden der diese Daten verlangt und gleich damit ein Anmeldungsversuch startet. Das Ergebnis dieser Anmeldung soll dann wiederum an den ursprünglichen Aufrufer zurück gegeben werden. Ist keiner dieser Authentifizierungsversuche geglückt so wird dieses Ergebnis (Nicht erfolgreiche Authentifizierung) ebenfalls dem Aufrufer zurück gegeben und die Aufgabe wird mit einem Defaultwert beendet.

Soweit so gut so konkret?

Das Problem dürfte jetzt die Ausführung dieser Authentifizierung an den dafür benötigten Punkten/Aufgaben sein.
Ich habe bereits gegoogelt. Was ich gefunden habe war der Interceptor-Patter, jedoch weis ich nicht ob ich den in meinem Fall anwenden kann, da ich bisher nur Beispiele gesehen habe in dennen es ums Logging und Exceptionhandling ging.

Anwendungsseitig nutze ich das Microsoft Prism Framework in Verbindung mit Unity.
Was tricky werden wird ist in diesem Fall vermutlich das Threadhandling? Zumindest für den UI Teil muss ja auf den UI-Thread synchronisiert werden. Die Aufgabe die auf die Authentifizierung folgt wäre so gesehen ein LongRunningTask (Daten vom Server laden z.B.) und sollte dann am besten (von Fall zu Fall) auf einen anderen Thread ausgelagert werden.

Ich hoffe hier rübergebracht zu haben worums geht, vielleicht hat ja jemand ne Idee wie man dieses Problem am elegantesten lösen könnte?

Konkrete Grüße 😉
Chronos

P
1.090 Beiträge seit 2011
vor 9 Jahren

Mit c# prism authentication findest du einige Links zu dem Thema.

Mit Unity kenne ich mich jetzt nicht so aus, aber ich gehe jetzt mal davon aus das du dort genau wie im MEF die Instanzen auch als Singelton Erzeugen kannst. Bei einer Rollenbasisenden Authentifizieren, sollte die Geschwindigkeit kein Problem sein. Grundlegend sollten aber such Server anfragen so schnell sein das das kein Problem ist.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
Chronos Themenstarter:in
132 Beiträge seit 2008
vor 9 Jahren

Hi, danke dir für deine Antwort. Jedoch ist die Anmeldung per se jetzt nicht das Problem.

In der Anwendung habe ich einen InteractionService implementiert der mittels InteractionRequest aus dem Prism Framework die View öffnen kann.

Das eigentliche Problem besteht vielmehr im Ablauf der ganzen Authentifizierung. Synchron ist das soweit erstmal kein Problem.

Jedoch habe ich das Problem das dabei die UI Blockiert und der Login deshalb in einem anderen Thread ausgeführt werden müsste. Auf die Zeitliche Verzögerung habe ich jedoch keinen Einfluss da während des Logins Daten vom Server abgerufen werden müssen. Das Problem wird größer wenn ich aus diesem Authentifizierungsthread wegen nicht gelungener Anmeldung einen neuen Dialog anzeigen lassen muss der die LoginMethod erneut, jedoch ohne öffnen des Dialogs im Fehlerfall, startet.

Und da hätte ich gedacht das es da vielleicht nen Entwurfsmuster dazu gäbe. Was wie gesagt ich bis jetzt in diese Richtung gefunden habe war dies hier. Aber ob das wirklich in meinem Fall brauchbar ist und ich mich damit nicht wieder in eine Sackgasse manövriere?!?

AOP - Interception with Unity 2.0

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Chronos,

so ganz habe ich nicht verstanden, wo dein Problem liegt. Einen längeren Ablauf in einen extra Thread zu verlagern, damit das GUI nicht blockiert und anderseits sicherzustellen, die erforderlichen Zugriffe auf GUIs wieder an den GUI-Thread zu delegieren, ist doch eine Standard-Aufgabe, die zudem in [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) ausführlich mit allen Varianten - und auch Fallsticken, die es zu vermeiden gilt - beschrieben ist.

Eine Möglichkeit sind z.B. Tasks und Continuations, die man im jeweils erforderlichen Thread laufen lässt. Oder ab C# 5.0 auch async und await. Aber auch mit allen anderen Mitteln echter Nebenläufigkeit (Thread, ThreadPool, BackgroundWorker, ...) bekommt man das hin.

Auch die Frage, wie man innerhalb eines längeren Ablaufes Benutzerdaten ermittelt, wurde im Forum und erst recht im Netz sicher nicht zum ersten Mal behandelt. Auch hier liegt die Lösung darin, die Gesamtaufgabe so zu unterteilen, dass die Teilaufgaben von der jeweils zuständige Schicht ausgeführt werden können. Mit ereignisgesteuerter Programmierung ist das in der Regel kein Problem.

herbivore