La question est de savoir quel mécanisme de cache utiliser ? Comme nous sommes en train de manipuler le cookie d'authentification, il semble naturel de l'utiliser comme cache. De plus, les caches classiques d'asp.net sont difficilement utilisables puisque le contexte de l'application n'existe pas encore. Maintenant c'est très simple, il suffit de savoir transformer un tableau de chaînes de caractères en chaîne de caractères et inversement.
// Lecture des roles de l'utilisateur, il suffit remplacer le tableau par du code
// qui retourne un tableau de string
string[] roles = new string[] { "role1", "role2" };
// transformation du tableau en chaîne avec | comme séparateur de chaîne
StringBuilder rolesString = new StringBuilder();
for (int i = 0; i < roles.Length -1; i++)
{
rolesString.Append(roles[i]);
rolesString.Append("|");
}
rolesString.Append(roles[roles.Length - 1]);
Le code fait la lecture simplissime des rôles en les créant ex-nihilo (à vous de faire le votre). Le tableau de chaînes
roles est transformé en une chaîne
rolesString qui utilise le caractère '|' comme séparateur. Ou encore plus simple, en utilisant la méthode
String.Join() (merci pour ton commentaire Aurélien).
// Création du ticket d'authentification cas
FormsAuthenticationTicket formAuthTicket = new
FormsAuthenticationTicket(
1, // version
netid, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(20), // expiration
false, // persistant
rolesString.ToString()); // userData
On met cette chaîne dans les données utilisateur du ticket d'authentification qui sera sérialisé dans le cookie d'authentification.
La deuxième étape consiste à récupérer les données du cookie d'authentification pour le mettre dans l'instance de l'objet principal.
// lecture du cookie d'authetification asp.net
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
// Lecture des roles de l'utilisateur, depuis le cookie d'authentification
string[] roles = authTicket.UserData.Split(new char[] { '|' });
// Création d'un principal pour l'application
FormsIdentity identity = new FormsIdentity(authTicket);
GenericPrincipal principal = new GenericPrincipal(identity, roles);
// attach the principal to tue context objet that will flow throughout the request.
application.Context.User = principal;
Le tableau de chaînes
roles est extrait du cookie d'authentification et ensuite utilisé lors le l'instanciation du
GenericPrincipal .