IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Comment stocker un CustomPrincipal dans le HttpContext.Current.User ?


Sujet :

ASP.NET

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Par défaut 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

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 67

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Par défaut
    ca aurai pu malheureusement je suis en mode Windows et non Forms....

    merci quand même de la contribution
    je dois être le seul à vouloir faire comme ca c'est pas possible... (enfin vouloir, disons que j'ai pas trop le choix)

  4. #4
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Par défaut Peut être qu'avec un peu de code, j'aurais plus de réponses...
    Donc voilà le code de ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ????

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/05/2006, 16h02
  2. [VB.Net] Comment stocker un .doc dans une BDD ?
    Par SergeF dans le forum Contribuez
    Réponses: 8
    Dernier message: 12/10/2005, 12h43
  3. Comment stocker des images dans une base de données ?
    Par [Silk] dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/07/2005, 11h29
  4. Comment stocker du multimédia dans ma bdd?
    Par Invité dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 22/08/2003, 09h44
  5. Comment stocker un ficher dans une table postgres
    Par josoft dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/06/2003, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo