Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.11.2013, 14:52

[C#] Login-Informationen verwalten

Dieses Problem beschäftigt mich schon länger. Nach erfolgreichem Einloggen des Users (durch Verifikation über einen Server) möchte ich 'global' auf den Usernamen/ID und darauf bezogene Profildaten zugreifen können. Natürlich könnte ich dafür einfach eine Singleton-Klasse abusen oder statische Attribute verwenden, aber das scheint mir nicht allzu sauber. Außerdem befürchte ich, dass eine einzelne Variable, die z.B. die UserID des eingeloggten Users speichert, zu unsicher ist, da man sie leicht ändern könnte. Sessions habe ich auch schon gesehen, die scheinen aber eher was für Web-Anwendungen zu sein. In Java gibt es für sowas Beans, wie ist das in C#?

Wie also kann ich mit den Profildaten des eingeloggten Users sicher umgehen und feststellen, als welcher User ich gerade eingeloggt bin?

Bonusfrage: Wie werden diese Login-Informationen in Onlinespielen allgemein gehandhabt? Gibt es dauerhafte Pings an den Server, um festzustellen, ob man noch online ist? Werden dabei die Login-Informationen im Hintergrund wiederholt abgefragt?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

19.11.2013, 15:30

Wenn es sicher sein soll, muss es sogar egal sein ob wenn jemand den Usernamen im Speicher des Clients austauscht. Sprich: Der Server muss ne ganze Menge Logik mitschleppen um immer zu überprüfen ob eine Aktion legal ist. D.h. der Server wird auch einen Client eine Art Session zuordnen müssen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

19.11.2013, 15:51

Du möchtest diese Informationen nicht global haben, bzw brauchst das gar nicht wollen. Ansonsten würde dir die Lösung mit static ja gefallen. Aber du hast schon richtig erkannt, wirklich sauber wäre das nicht. Normal würdest du wohl erst mal eine Klasse für einen Nutzer benötigen. Dort stehen Informationen wie ID etc drin. Dann wirst du in deinem Code irgendwo eine logische Schicht haben, in welcher aktueller Benutzer und sonstige Dinge stehen. Je nach Anwendung kann diese Schicht verschieden aussehen. Von dort holst du dir dann die Daten die du brauchst. Es kann wirklich hilfreich sein dein Design einfach in grobe Schichten aufzuteilen und dann zu gucken welche Schichten wie zusammen hängen und wie zusammen arbeiten. Dann musst du bei deinem Code halt gucken in welche Schicht er gehört und wie er mit den anderen Schichten interagiert. Solche Schichtenarchitekturen lassen sich nicht unbedingt sinnvoll auf jedes Problem anwenden (mit Einschränkungen), können aber sinnvoll eingesetzt werden. Vor allem für deine Serveranwendung solltest du so gut Struktur rein bringen. Ein weiterer Begriff wäre die Geschäftslogik welche ich mal in den Raum werfen möchte. Wenn dir MVC was sagt kennst du das Prinzip ja schon. Ich möchte damit nicht sagen du sollst genau so einteilen, aber sicherlich kannst du dir hier Inspiration holen. Wenn du dann deine Schichten kennst kannst du auch gucken wo sich was einordnen lässt. Ansonsten hängt es stark vom Design ab, wo solche Daten wie aktueller User nun gehalten werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

equinox

Frischling

Beiträge: 56

Beruf: Student

  • Private Nachricht senden

4

19.11.2013, 16:03

Wenn ich das richtig verstanden habe möchstest du verhindern, dass der Client dem Server falsche bzw. ungültige Daten unterjubelt?

In dem Fall musst du natürlich serverseitig alle Eingaben prüfen. Einen Punkt den du bereits nanntest sind Sessions: Wenn du dies kryptographisch korrekt implementierst hat der User nur noch wenige Chancen sich als ein anderer User auszugeben, was schon ein großer Gewinn ist. Die anderen Daten sollte ein Server sowieso immer Prüfen, was ist in dem Fall in dem ein User falsche Datenverschickt, weil er sich vertippt hat?
Und das wichtigste: Sessions sind kein Modell welches auf Webanwendungen begrenzt ist. Die Anwendung liegt beim Entwickler.

Zum noch eingeloggt sein: Ich würde das ebenfalls über Sessions lösen.
Du definierst eine Sessiongültigkeit. Diese erhält die Session am leben, wenn der User kein Signal sendet. Und nun sagen wir schickt der User alle 30 Sekunden ein Heartbeat-Signal um zu zeigen, dass er noch da ist. Wenn das passiert wird die Gültigkeit der Session erneuert. Wenn nicht hat der User immer noch ein Zeitfenster in dem die Session gültig ist(Was in meinen Augen recht praktisch ist falls der User kurzzeitig die Verbindung verliert)

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

5

19.11.2013, 16:15

Wie wird denn dann die Session einem Benutzer zugeordnet, durch ne SessionID? Ich habe ja nur die Möglichkeit, jedesmal die kompletten Credentials zu senden, oder ich generiere für eine Session eine ID, die bei jeder Anfrage mitgeschickt wird, so dass darüber die Session dem Benutzer zugeordnet werden kann. In beiden Fällen, kann ich aber bei Kenntnis, der Credentials bzw. der SessionID mich als ein anderer Benutzer ausgeben.
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

19.11.2013, 19:04

Die Credentials jedes Mal zu senden klingt sehr so, wie es ein restful web service tun würde. Läuft den Server als Web Service auf einem Webserver oder programmierst du den selber? Falls du den selber entwickelst, wäre eine Möglichkeit wohl deinem Socketobjekt quasi die Session zuzuordnen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

7

20.11.2013, 10:04

@Schorch: Die Schichtenarchitektur werde ich mir ansehen. Danke!
@Thoran: Noch gar nicht. Aktuell verfiziert der Server meine Daten und ich speichere ab dann im Client eine Variable, die sagt, dass ich als xyz eingeloggt bin. Da ich nach dem Login beim Server P2P mit einem anderen Spieler spielen möchte, macht der Server dann nicht mehr viel.
@Legend: Der Server ist in C# geschrieben und läuft aktuell unter Mono auf einem Raspberry Pi. Das mit der Bindung an den Socket habe ich soweit verstanden.

Was noch unklar ist: Wie kann ich aus dem Client heraus den eingeloggten User verwalten? Gibt es dafür ein sinnvolles Pattern? Letztendlich hängen doch alle Wege davon ab, dass irgendwo ein Flag oder eine Variable den eingeloggten User beinhaltet.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

20.11.2013, 10:25

@Schorch
Es wird scheinbar echt zum Team-Sport seinen Namen falsch zu schreiben. Mindestens schon 5mal in den letzten 7 Tagen hier im Forum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

20.11.2013, 10:49

@Schorch
Es wird scheinbar echt zum Team-Sport seinen Namen falsch zu schreiben. Mindestens schon 5mal in den letzten 7 Tagen hier im Forum.

Hier gibt es doch eine Rechtschreibprüfung. Scheinbar sollte man den Namen aufnehmen. ;)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

20.11.2013, 11:56

Es waren 4 verschiedene Varianten, wenn ich mich richtig erinnere ;) Die müsste man alle blocken, irgendwie sinnlos.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige