Gå til innhold

Logge på nettside som bruker "Windows Forms" authentication? Burde jo være enkelt...


Anbefalte innlegg

Jeg har laget en bitteliten nettjeneste i .NET 4.0. Den er basert på asp.net sin default "New site" template, og bruker følgelig Windows Forms authentication for pålogging. Nå har jeg begynt å lage en liten web API som returnerer et XML-dokument med informasjon basert på input via URL. XML'en skal selvfølgelig tolkes av program eller WP7 mobil app.

 

Jeg tenkte at siden alt er .NET og bruker Windows Forms authentication, så er det bare å bruke NetworkCredentials. Men så enkelt er det ikke. Jeg får kun påloggingssiden tilbake.

 

Private Function GetData(ByVal command As String) As System.Xml.XmlDocument
    Dim kakeboks As New CookieContainer() 'Silly name but I couldn't resist... 
    Dim url As String = "http://somepage.org/api.aspx?cmd=" & command

    Dim req As Net.HttpWebRequest = HttpWebRequest.Create(url)
    req.Method = "GET"
    req.Credentials = New NetworkCredential("enbruker", "etpassord")
    req.CookieContainer = kakeboks
    req.PreAuthenticate = True

    Dim response As HttpWebResponse = req.GetResponse
    Dim responsestream As IO.StreamReader = New IO.StreamReader(response.GetResponseStream, System.Text.Encoding.GetEncoding("UTF-8"))

    'Getting response
    Dim output As String = responsestream.ReadToEnd

    'Cleaning up
    responsestream.Close()
    responsestream.Dispose()
    responsestream = Nothing
    response.Close()
    response = Nothing
    req = Nothing

    'Debug...
    Console.WriteLine(output)

    'Reading the output XML
    Dim result As New System.Xml.XmlDocument
    result.LoadXml(output)
    Return result
   End Function

 

Hva gjør jeg galt?

Lenke til kommentar
Videoannonse
Annonse

Hei,

 

etter hva jeg er kjent med er det ikke så enkelt nei. Windows Forms auth leser ikke automatisk fra network credentials som etter min oppfatning ligger i header som sendes til side, det gjør i og for seg http post data og da som (jeg vil tro) er den mest vanlige metoden for autentisering.

 

Dim req As Net.HttpWebRequest = HttpWebRequest.Create(url)
req.Method = "POST" ' Angir forespørsel metode, POST for å sende data
req.CookieContainer = kakeboks
req.ContentType = "application/x-www-form-urlencoded" ' Setter att det er en data sendt med forespørselen
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("Username=brukernavn&password=passord")
Stream dataStream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
req.ContentLength = byteArray.Length
'Send forespørsel og legg svar i ny variabel
Dim response As WebResponse = request.GetResponse()

 

Kjapt og gale! Prinsippet skal være der. Dette vil neppe fungere med copy paste så du må nok prøve å se hva som gjøres og hvordan det egentlig henger sammen.

 

For å finne ut hva data feltene som forespørs av en side er det å gå til kildekoden på en side og se finne <form> for innloggingen.

 

NetworkCredential fungerer om siden er beskyttet med Windows Pålogging (dvs. att det kommer opp en dialog når du kommer til en side som spør etter brukernavn og passord) gjerne benyttet på interne sider på arbeidsplasser med domene ;-)

 

Håper du mener hva jeg forsto :)

Lenke til kommentar

Hei,

 

etter hva jeg er kjent med er det ikke så enkelt nei. Windows Forms auth leser ikke automatisk fra network credentials som etter min oppfatning ligger i header som sendes til side, det gjør i og for seg http post data og da som (jeg vil tro) er den mest vanlige metoden for autentisering.

 

Dim req As Net.HttpWebRequest = HttpWebRequest.Create(url)
req.Method = "POST" ' Angir forespørsel metode, POST for å sende data
req.CookieContainer = kakeboks
req.ContentType = "application/x-www-form-urlencoded" ' Setter att det er en data sendt med forespørselen
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("Username=brukernavn&password=passord")
Stream dataStream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
req.ContentLength = byteArray.Length
'Send forespørsel og legg svar i ny variabel
Dim response As WebResponse = request.GetResponse()

 

Kjapt og gale! Prinsippet skal være der. Dette vil neppe fungere med copy paste så du må nok prøve å se hva som gjøres og hvordan det egentlig henger sammen.

 

For å finne ut hva data feltene som forespørs av en side er det å gå til kildekoden på en side og se finne <form> for innloggingen.

 

NetworkCredential fungerer om siden er beskyttet med Windows Pålogging (dvs. att det kommer opp en dialog når du kommer til en side som spør etter brukernavn og passord) gjerne benyttet på interne sider på arbeidsplasser med domene ;-)

 

Håper du mener hva jeg forsto :)

Aw, crap! Håpet det skulle være så enkelt... ;)

Får bruke POST da.

 

Vel, da får jeg sjekke hva som sendes. Det blir nok litt tricky (for meg) å finne ut da default template gjør mye fancy i bakgrunnen...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...