Aufgabenstellung
Im Internet sollen sich Benutzer an einer Anmeldemaske einer Flex-Anwendung anmelden. Die Berechtigungen sollen anhand des Benutzernamens festgelegt werden.
Ansatz
1.) FLEX: Erstellen der Anmeldemaske mit User/Passwort
2.) C#: Überprüfung ob die User/Passwort-Kombination in der Datenbank vorhanden ist
3.) C#: Falls JA: Benutzer in die sessionvariable USERNAME schreiben / Falls NEIN: Tue nichts
4.) C#: Überprüfung der Backend-Services: Ist USERNAME leer?
NEIN: Darf der User die Daten aufrufen?? (Dem Benutzer kann eine ROLLE zugewiesen sein, siehe Artikel „FluorineFX: Windows Authentifierung… Single Sign On“, und anhand der Rolle kann ermittelt werden ob sie berechtigt ist die Daten abzurufen).
JA: Keine Daten ausliefern!!!
5.) FLEX: Falls user authentifziert: Maskenaufbau in der Flexanwendung entsprechend Rolle
Lösung
Hier die wichtigsten Auszüge aus meiner Lösung:
FLEX:
... <mx:Script> public function getAuthenticationHandler(event:ResultEvent):void { if( (event.result as Boolean) ) { // Schalte ViewStack um (keine Loginmaske mehr) loginStack.selectedChild=tarzanScreen; // Speichere Username in Modellocator (evtl. auch Rolle holen) ModelLocator.getInstance().myUser=txtUsername.text; } else { Alert.show('Wrong username or password!'); } } </mx:Script> ... <mx:TextInput id="txtUsername" /> <mx:TextInput id="txtPasswort" displayAsPassword="true"/> ... <mx:RemoteObject id="authenticationService" destination="GenericDestination" source="TarzanServices.AuthenticationService" showBusyCursor="true" fault="faultHandler(event)" > <mx:method name="getAuthentication" result="getAuthenticationHandler(event)"/> </mx:RemoteObject>
C#: Benutzername ermitteln: Falls „none“ einfach nix in Maske/Service machen:
using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Data.SqlClient; using System.Web; using FluorineFx; using System.Security.Principal; ... public string getSessionUser() { if (FluorineFx.Context.FluorineContext.Current.Session["username"]==null) return "none"; return FluorineFx.Context.FluorineContext.Current.Session["username"].ToString(); }
C#: Überprüfe ob User/Kennwort-Kombination in der Datenbank vorhanden ist, falls JA, schreibe USERNAME in Sesseion und liefere TRUE zurück, damit Flex weiß das es von der Login-Maske weg darf.. (REAKTION IN FLEX).
public bool getAuthentication(string username, string password) { SqlConnection conn = new SqlConnection(MyConfigurationManager.msSqlServerString); try { conn.Open(); SqlCommand comm = new SqlCommand(); comm.Connection = conn; comm.CommandText = "SELECT * FROM [users] WHERE [username]=@username "+ "AND [password]=@passwort"; comm.Parameters.AddWithValue("username", username); comm.Parameters.AddWithValue("passwort", password); int i = 0; SqlDataReader reader = comm.ExecuteReader(); while (reader.Read()) { i++; } if (i > 0) { // Schreibe USER in die Datenbank FluorineFx.Context.FluorineContext. Current.Session["username"] = username; } return i > 0; } catch (Exception e) { return false; } return false; }