Avatar billede bjornhart Nybegynder
07. maj 2006 - 18:35 Der er 14 kommentarer og
1 løsning

Fejl ved opretning af egen klasse

I forbindelse med et loginsystem har lavet flg. klasse:

Public Class CustomPrincipall
    Inherits System.Security.Principal.GenericPrincipal

    public email as string

    Public Sub New(ByVal id As System.Security.Principal.GenericIdentity, ByVal role As String(), eemail as string)
        MyBase.New(id, role)
        email = eemail
    End Sub


End Class

Når en bruger logger ind bliver flg. udført:

HttpContext.Current.User = New CustomPrincipall(User.Identity, roleListArray, emailadr.text)

Fra en hvilken som helst side er det så meningen, at jeg skal kunne få fat i min nye klasse ved flg. syntax:

Dim cp As CustomPrincipall = HttpContext.Current.User
textbox.text = cp.email

Det virkede i asp.net 1.1 men efter jeg har taget asp.net 2.0 i brug får jeg flg fejl:

<Et objekt af typen 'System.Security.Principal.GenericPrincipal' kan ikke konverteres til typen 'CustomPrincipall'.>
når jeg udfører koden:
Dim cp As CustomPrincipall = HttpContext.Current.User

Er der nogen der kan gennemskue hvorfor?
Avatar billede snepnet Nybegynder
07. maj 2006 - 21:35 #1
Avatar billede bjornhart Nybegynder
07. maj 2006 - 22:06 #2
tak for inputtet, men jeg fandt desværre ikke noget jeg kunne bruge.
Avatar billede dj_uncas Nybegynder
07. maj 2006 - 22:08 #3
HttpContext.Current.User returnerer en IPrincipal og altså ikke umiddelbart det du har smidt i den (CustomPrincipal).

Du kan stadig bruge de metoder/properties der er på IPrincipal direkte, eller caste til CustomPrincipal:

IPrincipal principal = HttpContext.Current.User;
CustomPrincipal cp = (CustomPrincipal)principal;


Der er også en mulighed for at lave et lidt mere "safe" cast (i hvert fald i C#, jeg ved ikke helt med VB):

IPrincipal principal = HttpContext.Current.User;
CustomPrincipal cp = principal as CustomPrincipal;

I det nederste eksempel vil cp være "null" hvis principal ikke kan castes til CustomPrincipal, mens der i det øverste vil blive kastet en Exception...
Avatar billede bjornhart Nybegynder
07. maj 2006 - 22:19 #4
Jeg kan ikke få det til at fungere måske fordi jeg koder i vb. Har du noget bud på hvorfor det virkede under v1.1.
Avatar billede snepnet Nybegynder
07. maj 2006 - 22:42 #5
hvis du debugger  ... hvad er HttpContext.Current.User så på den linie?
mvh
Avatar billede snepnet Nybegynder
07. maj 2006 - 22:43 #6
og hvis du sætter et breakpoint her:
HttpContext.Current.User = New CustomPrincipall(User.Identity, roleListArray, emailadr.text)
rammer du det så?
mvh
Avatar billede bjornhart Nybegynder
24. maj 2006 - 14:10 #7
Hej snepnet.
Hvis jeg debugger så bliver typen af httpContext.current.user sat til Customprincipal men så snart jeg typecaster httpContext.current.user fra en anden side så kan jeg se at httpContext.current.user er af typen GenericPrincipal....

Jeg tror at jeg går over til at lave en session variabel med min klasse i. Det er noget nemmere..
Avatar billede snepnet Nybegynder
24. maj 2006 - 15:33 #8
Jeg forstår egenlig ikke at du ikke kunne bruge linket til noget... Jeg synes det ser fuldstændig relateret ud.
Har du kigget det ordentlig igennem? (Bill Lumberg's post omhandler nøjagtig samme castingproblematik).
Der er også henvisninger til den web project template MS har frigivet, og som giver en "2003 oplevelse" i 2005 + letteregør migrering.
Du kan læse mere om den her:
http://weblogs.asp.net/scottgu/archive/2006/05/08/VS-2005-Web-Application-Project-V1.0-Released.aspx
Mvh
Avatar billede snepnet Nybegynder
24. maj 2006 - 15:44 #9
Avatar billede bjornhart Nybegynder
24. maj 2006 - 16:34 #10
Jeg har ikke vs2005 men bruger visual web dev. 2005 express edition, så derfor kan jeg ikke bruge linket. Iøvrigt så er det ikke et projekt jeg har migreret fra asp 1.0 jeg sidder og arbejder på. Det er et nyt projekt i 2.0, hvor jeg gerne ville have brugt samme metode som jeg brugte i 1.1.  Måske skyldes det at der i 2.0's global.asa ikke er mulighed for at køre kode når en bruger er blevet Authenticated. I 1.1 er der en sub i global.asa der hedder Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) i den udførte jeg HttpContext.Current.User = New CustomPrincipal. I 2.0 er der ikke den mulighed i global.asa så jeg laver kaldet HttpContext.Current.User = New CustomPrincipal på en almindelig webform. Dermed er HttpContext.Current.User muligvis allerede instantieret og låst?
Avatar billede snepnet Nybegynder
24. maj 2006 - 17:38 #11
Ahh ... :o)

Blot fordi metoden ikke står der på forhånd - betyder det ikke at du ikke kan bruge den... Bare indsæt den manuelt i global.asax

void Application_AuthenticateRequest(object sender, EventArgs e)
{
  // og så din implementering
}

Mvh
Avatar billede bjornhart Nybegynder
24. maj 2006 - 19:00 #12
Der var løsningen!!! øv jeg har godt nok brugt lang tid på det. HttpContext.Current.User = new CustomPrincipal kan kun sættes i global.asa's metode Application_AuthenticateRequest.

Tusind tak for hjælpen snepnet. Er der en liste over metoder i global.asa et eller andet sted?
Avatar billede bjornhart Nybegynder
24. maj 2006 - 19:01 #13
Send et svar snepnet
Avatar billede snepnet Nybegynder
24. maj 2006 - 21:29 #14
Et svar får du her :o)
Det er et meget godt spørgsmål du der stiller.... Du kan slå HttpApplication-klassen op. Det er sådan en der bliver instantieret. Eller rettere - du får en klasse der hedder global_asax, der er en specialisering af HttpApplication.

Det er eventhandlers du opretter i klassen, så som udgangspunkt vil du kunne håndtere alle events der eksponeres af HttpApplikation objekter:
(Nedenstående er fra HttpApplication-klassen i version 2.0 af frameworket... Har ikke checket om der er forskelle).

      public event EventHandler AcquireRequestState;
      public event EventHandler AuthenticateRequest;
      public event EventHandler AuthorizeRequest;
      public event EventHandler BeginRequest;
      internal event EventHandler DefaultAuthentication;
      public event EventHandler Disposed;
      public event EventHandler EndRequest;
      public event EventHandler Error;
      public event EventHandler PostAcquireRequestState;
      public event EventHandler PostAuthenticateRequest;
      public event EventHandler PostAuthorizeRequest;
      public event EventHandler PostMapRequestHandler;
      public event EventHandler PostReleaseRequestState;
      public event EventHandler PostRequestHandlerExecute;
      public event EventHandler PostResolveRequestCache;
      public event EventHandler PostUpdateRequestCache;
      public event EventHandler PreRequestHandlerExecute;
      public event EventHandler PreSendRequestContent;
      public event EventHandler PreSendRequestHeaders;
      public event EventHandler ReleaseRequestState;
      public event EventHandler ResolveRequestCache;
      public event EventHandler UpdateRequestCache;

Derudover er det så en klasse som alle andre - så du kan skrive de metoder du vil (men du skal så kalde dem selv).

Det er et lidt specielt område... Tag eventuel et kig her:
http://aspnetresources.com/articles/event_handlers_in_global_asax.aspx

Mvh
Avatar billede bjornhart Nybegynder
24. maj 2006 - 22:22 #15
Jeg takker og bukker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester