Comment stocker un CustomPrincipal dans le HttpContext.Current.User ?
Bonjour,
Mon contexte est le suivant :
Pages ASP.NET 2.0 avec Visual Studio 2005
Serveur IIS 6.0 sur Windows 2003 Server
Rien de bien exotique... vous voyez
Je suis en mode d'authentification Windows.
Sur mon application intranet, les utilisteur de mon réseau doivent être reconnus automatiquement, et comme nous disposons d'information sur eux dans une base Active Directory, je lance une requete AD sur le AuthenticateRequest du global.asax afin d'obtenir les informations les concernant. L'objet ainsi rempli (un CustomPrincipal implémentant IPrincipal) est stocké dans le HttpContext.Current.User. La remontée d'infos et le stockage fonctionnent bien ,sauf que la persistance n'est pas bonne...
Je m'explique dès que j'arrive sur le Session_Start, et que je regarde ce qu'il se trouve dans le HttpContext.Current.User, il se trouve que j'ai un objet de type System.Security.RolePrincipal, que bien sur je ne peux pas caster dans mon CustomPrincipal alors qu'ils implémentent la même interface...
Celà fait 4 jours que je passe dessus, j'ai essayé beaucoup de solutions, je donne ma langue au chat parce que là franchement je ne comprends pas ce que je fait mal.... alors si quelqu'un à déjà rencontré ce truc là... qu'il fasse partager son savoir faire... Merci d'avance
Peut être qu'avec un peu de code, j'aurais plus de réponses...
Donc voilà le code de ma méthode :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Authentication()
End Sub
Private Sub Authentication()
If (System.Web.HttpContext.Current.Request.IsAuthenticated = True) Then
Dim cIdentity As AccessControl.CustomIdentity
With System.Web.HttpContext.Current.User
cIdentity = New AccessControl.CustomIdentity()
cIdentity.SetIsAuthenticated(.Identity.IsAuthenticated)
cIdentity.SetUserName(.Identity.Name)
End With
Dim cPrincipal As New AccessControl.CustomPrincipal(cIdentity)
' Crée le cookie pour les roles et groupes si il n'existe pas pour cette session
If (Not AccessControl.Security.CookieExists) Then
' Verification des habilitations
If (Not AccessControl.Security.isAuthenticated(cPrincipal)) Then Return
AccessControl.Security.SetCookie(cPrincipal)
Else
AccessControl.Security.GetCookie(cPrincipal)
End If
End If
End Sub |
et le code de la méthode SetCookie
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
Public Shared Sub SetCookie(ByVal user As CustomPrincipal, ByVal strDebugUserName As String, ByVal dblCookieExpires As Double)
Dim userInformation As String = String.Empty
' Si on veut utiliser un trigramme de DEBUG afin de se substituer
' à l'utilisateur d'origine, on va redéfinir "user"
If Not strDebugUserName = NOT_DEBUG_USER_NAME Then
'Remplacement du Directory Helper
Dim u As ADUser = New ADUser
u.UserAccountName = strDebugUserName
u.Domaine = user.Domaine
If (u.FindUser) Then
user.UserName = u.UserAccountName
user.FirstName = u.FirstName
user.LastName = u.LastName
user.Service = u.Service
user.Departement = u.Departement
user.Entity = u.Entite
user.Mail = u.Mail
user.GetADGroups = u.Groups
user.Groups.Load(u.UserAccountName, _appID)
user.Roles = Role.GetRoles(user, _appID)
If user.Roles.Count > 0 Then
user.Grant = True
Else
user.Grant = False
System.Web.HttpContext.Current.User = user
End If
user.Grant = True
System.Web.HttpContext.Current.User = user
End If
If user.FirstName = String.Empty Then
user.FirstName = "Inconnu"
End If
End If
userInformation = "ID=" & user.UserID & ";" & _
"FN=" & user.FirstName & ";" & _
"LN=" & user.LastName & ";" & _
"UN=" & user.UserName & ";" & _
"GP=" & user.GetGroupesByID() & "," & user.GetGroupesByLabel() & "," & user.GetGroupeRoleByID & ";" & _
"RO=" & user.GetRolesByID() & "," & user.GetRolesByLabel() & ";" & _
"RI=" & user.GetCollectionRoles.Rights & ";" & _
"AL=" & user.GetCollectionRoles.AccessLevel & ";" & _
"SI=" & user.Service & ";" & _
"DP=" & user.Departement & ";" & _
"EN=" & user.Entity & ";" & _
"MA=" & user.Mail
HttpContext.Current.Response.Write("UserInformation 1: " + userInformation & "<br>")
' Create a cookie authentication ticket.
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket( _
1, _
user.UserName, _
DateTime.Now, _
DateTime.Now.AddMinutes(dblCookieExpires), _
True, _
userInformation)
' Cryptage du ticket
Dim cookieStr As String = FormsAuthentication.Encrypt(ticket)
' Envoie le cookie au client
Dim clientCookie As System.Web.HttpCookie = New System.Web.HttpCookie(_cookieName, cookieStr)
With clientCookie
.Path = "/"
.Expires = DateTime.Now.AddMinutes(dblCookieExpires)
End With
HttpContext.Current.Response.Cookies.Add(clientCookie)
' Ajoute un objet CustomPrincipal a la requete contenant l'identité de l'utilisateur, son id
' ses roles et ses groupes
HttpContext.Current.User = user
End Sub |
Donc tout ce petit monde fonctionne, celà remplace bien le user du HttpContext par mon CustomPrincipal qui contient plein d'infos issues d'active Directory..
Sauf que deux secondes après être sorti de l'authenticate request, à chaque évenement levé par l'application, c'est un objet de type RolePrincipal dans mon HttpContext.Current.User...
???? Quelqu'un à une idée ????