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;
}