Aanmelden met Microsoft
Meld u aan of maak een account.
Hallo,
Selecteer een ander account.
U hebt meerdere accounts
Kies het account waarmee u zich wilt aanmelden.

ASP .NET Support Voice Column

Problemen met formulierverificatie oplossen

Welkom bij de kolom ASP.NET Support Voice! Mijn naam is Jerry Orman. Ik werk al meer dan 5 jaar bij Microsoft en heb het grootste deel van mijn tijd besteed aan webgerelateerde technologieën, zoals Microsoft FrontPage en de nieuwe Microsoft SharePoint-technologieën. Ik heb het afgelopen jaar gewerkt met Microsoft ASP.NET als ondersteuningstechnicus. Deze maand ga ik in de kolom Ondersteuningsstem uitleggen hoe u problemen met formulierverificatie in Microsoft ASP.NET oplost.

Problemen met formulierverificatie oplossen

Wanneer u Formulierverificatie gebruikt in een ASP.NET-toepassing, moet u mogelijk een probleem oplossen dat optreedt wanneer de gebruiker willekeurig wordt omgeleid naar de aanmeldingspagina. In een ideale wereld zou dit probleem zich voordoen op een manier waarmee u eenvoudig een foutopsporingsprogramma kunt koppelen en het probleem kunt vastleggen. In productieomgevingen is dit echter zelden het geval. Als u een willekeurig probleem zoals dit wilt oplossen, moet u informatie over het probleem vastleggen, zodat u de hoofdoorzaak kunt beperken.

In deze kolom gaan we kort in op het concept formulierverificatie. Vervolgens bekijken we welke scenario's ertoe leiden dat een gebruiker wordt omgeleid naar de aanmeldingspagina en hoe we gegevens kunnen vastleggen die relevant zijn om het probleem te isoleren. We bespreken ook hoe u een IHttpModule-interface implementeert om de formulierverificatiegegevens te registreren.

Overzicht van formulierverificatie

Wanneer een gebruiker zich verifieert bij een website met behulp van formulierverificatie, maakt de server een cookie. De waarde van de cookie is een versleuteld formulierverificatieticket. De cookie wordt bij elke aanvraag aan de toepassing aan de server doorgegeven en de klasse FormsAuthenticationModule ontsleutelt de cookiewaarde en bepaalt of de gebruiker geldig is of niet.

Standaard wordt de klasse FormsAuthenticationModule toegevoegd aan het bestand Machine.config. De klasse FormsAuthenticationModule beheert het FormsAuthentication-proces.

Hier volgt een vermelding uit het Machine.config-bestand:

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

Het algemene HTTP-verkeer voor verificatie met behulp van Formulierverificatie ziet er ongeveer als volgt uit:

  1. De client verzendt een HTTP GET naar Default.aspx. Er wordt geen formulierverificatiecooky verzonden.

  2. De server verzendt een 302-antwoord (omleiding) naar Login.aspx.

  3. De client verzendt een HTTP POST naar Login.aspx. Het bevat de aanmeldingsgegevens.

  4. De server verzendt een 302-antwoord (omleiding) naar Default.aspx. De formulierverificatiecooky is opgenomen.

  5. De client verzendt een HTTP GET naar Default.aspx. Dit omvat de formulierverificatiecooky.

Ga naar de volgende MSDN-websites voor meer informatie over het implementeren en gebruiken van formulierverificatie:

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxGa naar de volgende ASP.NET website voor meer informatie over het delen van formulierverificatiecookies:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

Redenen waarom een gebruiker kan worden omgeleid naar de aanmeldingspagina

De formulierverificatiecooky is verloren gegaan

Scenario 1


In dit scenario meldt een gebruiker zich aan bij de website. Op een bepaald moment verzendt de client een aanvraag naar de server en de
De klasse FormsAuthenticationModule ontvangt de cookie niet. U kunt bepalen of een gebruikersaanvraag de cookie niet bevat door cookielogboekregistratie in te schakelen in Microsoft Internet Information Services (IIS). Voer hiervoor de volgende stappen uit:

  1. Open de IIS Microsoft Management Console (MMC).

  2. Klik met de rechtermuisknop op de website en klik vervolgens op
    Eigenschappen.

  3. Klik op het tabblad Website en klik vervolgens op Logboekregistratie inschakelen.

  4. Zorg ervoor dat de logboekindeling W3C Extended Log File Format is.

  5. Klik op Eigenschappen.

  6. Klik op het tabblad Geavanceerd en klik vervolgens op
    Uitgebreide eigenschappen.

  7. Klik onder Uitgebreide eigenschappen om het selectievakje Cookie(cs(Cookie)) en het selectievakje Verwijzer (cs(Verwijzer)) in te schakelen.

Nadat dit probleem is opgetreden, bepaalt u welke client het probleem had en het IP-adres van die client. Filter het IIS-logboek op het IP-adres van die client en bekijk de <cookie> kolom.

Opmerking U kunt Log Parser gebruiken om de IIS-logboeken te parseren. Als u Logboekparser wilt downloaden, gaat u naar de volgende Microsoft-website:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Nadat u de lijst met aanvragen van die specifieke gebruiker hebt, zoekt u naar de aanvragen op de aanmeldingspagina. U weet dat ze zijn omgeleid naar deze pagina en u wilt de aanvragen zien voordat de omleiding plaatsvond. Als u iets ziet dat lijkt op het volgende, heeft de client de cookie niet verzonden of is de cookie verwijderd op het netwerk tussen de client en de server.

Dit is de eerste aanmelding.

Methode

Pagina

Reactie

Cookies

TOEVOEGEN

/Default.aspx

302 (omleiden)

Geen cookies

TOEVOEGEN

/Login.aspx

200 (geslaagd)

Geen cookies

VERZENDEN

/Login.aspx

302 (omleiden)

Geen cookies

TOEVOEGEN

/Default.aspx

200 (geslaagd)

. ASPXAUTH

TOEVOEGEN

/SomePage.aspx

302 (omleiden)

No. ASPXAUTH-cookie

Dit zijn andere aanvragen, gevolgd door een aanvraag naar een pagina op de site zonder de . ASPXAUTH-cookie.

Methode

Pagina

Reactie

Cookies

TOEVOEGEN

/SomePage.aspx

302 (omleiden)

No. ASPXAUTH-cookie

TOEVOEGEN

/Login.aspx

200 (geslaagd)

No. ASPXAUTH-cookie

VERZENDEN

/Login.aspx

302 (omleiden)

No. ASPXAUTH-cookie

TOEVOEGEN

/SomePage.aspx

200 (geslaagd)

. ASPXAUTH


Opmerking De eerste aanvraag van die gebruiker heeft waarschijnlijk geen formulierverificatiecooky, tenzij u een permanente cookie maakt. In het IIS-logboek worden alleen de cookies weergegeven die in de aanvraag zijn ontvangen. De eerste aanvraag om de formulierverificatiecooky te hebben, bevindt zich op de aanvraag na een geslaagde aanmeldingspoging.

Scenario 2


De formulierverificatiecooky kan ook verloren gaan wanneer de cookielimiet van de client wordt overschreden. In Microsoft Internet Explorer is er een limiet van 20 cookies. Nadat de 20e cookie op de client is gemaakt, worden eerdere cookies verwijderd uit de verzameling van de client. Als de . DE ASPXAUTH-cookie wordt verwijderd. De gebruiker wordt omgeleid naar de aanmeldingspagina wanneer de volgende aanvraag wordt verwerkt.

U kunt deze twee scenario's op dezelfde manier oplossen. Bekijk de aanvraag vlak voor de omleiding naar de aanmeldingspagina. Als de aanvraag voor deze pagina cookies genereert, is dit iets om te onderzoeken.

U kunt Fiddler gebruiken om de HTTP-headers weer te geven die naar de client worden verzonden. Nadat u het verkeer hebt vastgelegd, dubbelklikt u op een aanvraag en klikt u vervolgens op Kopteksten om de Set-Cookie-header weer te geven. Als u een geslaagde aanmelding traceert, ziet u de Set-Cookie header in het antwoord van een geslaagde aanmelding.

Als u Fiddler wilt downloaden, gaat u naar de volgende Fiddler-website:

http://www.fiddlertool.com/fiddler/

Scenario 3


Nadat de aanvraag de client heeft verlaten, zijn er verschillende lagen die van invloed kunnen zijn op de pakketten die worden verzonden. Om te bepalen of een netwerkapparaat de cookie verwijdert, moet u een netwerktracering vastleggen op de client en de server en vervolgens in de hoofdtekst van de aanvraag naar de cookie zoeken. U wilt de clientaanvraag bekijken om er zeker van te zijn dat de cookie is verzonden en de servertracering controleren om er zeker van te zijn dat de server de cookie heeft ontvangen.

Clientaanvraag

Dit is een GET-aanvraag nadat de gebruiker is geverifieerd. De formulierverificatieticketgegevens zijn blauw gemarkeerd. Dit bevestigt dat de cookie-informatie de client heeft verlaten. Wanneer u een hulpprogramma voor netwerkopname gebruikt, zoals Netmon, ziet u het verkeer dat daadwerkelijk via de adapter is gegaan.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

Aanvraag

aan serverzijde Wanneer u kijkt naar de aanvraag die de server heeft bereikt, wilt u ervoor zorgen dat de server dezelfde informatie heeft ontvangen die de client heeft verzonden. Als de server niet dezelfde informatie heeft ontvangen, moet u andere apparaten in het netwerk onderzoeken om te bepalen waar de cookie is verwijderd.

Opmerking Er zijn ook exemplaren geweest van ISAPI-filters die cookies verwijderen. Als u bevestigt dat de webserver de cookie heeft ontvangen, maar de cookie niet wordt vermeld in de IIS-logboeken, controleert u de ISAPI-filters. Mogelijk moet u de filters verwijderen om te zien of het probleem is opgelost.

Time-out van het formulierverificatieticket

De andere veelvoorkomende oorzaak voor het omleiden van een gebruiker is dat het verificatieticket voor formulieren is verlopen. Het formulierverificatieticket kan op twee manieren een time-out uitvoeren. Het eerste scenario doet zich voor als u een absolute vervaldatum gebruikt. Bij een absolute vervaldatum verloopt het verificatieticket wanneer de verlooptijd verloopt. U stelt bijvoorbeeld een vervaldatum van 20 minuten in en een gebruiker bezoekt de site om 14:00 uur. De gebruiker wordt omgeleid naar de aanmeldingspagina als de gebruiker de site na 14:20 uur bezoekt.

Als u een verschuifbare vervaldatum gebruikt, is het scenario iets ingewikkelder. De cookie en het resulterende ticket worden bijgewerkt als de gebruiker de site bezoekt nadat de vervaltijd voor de helft is verlopen. U kunt bijvoorbeeld een vervaldatum van 20 minuten instellen met behulp van een glijdende vervaldatum. Een gebruiker bezoekt de site om 14:00 uur en de gebruiker ontvangt een cookie die is ingesteld om 14:20 uur te verlopen. De vervaldatum wordt alleen bijgewerkt als de gebruiker de site na 14:10 uur bezoekt. Als de gebruiker de site om 14:09 uur bezoekt, wordt het ticket niet bijgewerkt omdat de helft van de vervaltijd niet is verstreken. Als de gebruiker vervolgens 12 minuten wacht en de site om 14:21 uur bezoekt, is het ticket verlopen. De gebruiker wordt omgeleid naar de aanmeldingspagina.

Een manier om dit type probleem aan te pakken, is door de formulierverificatiecooky en ticketgegevens te registreren. Op deze manier kunt u zien of de cookie is ontvangen door IIS en wat de waarden zijn. U kunt dit doen door een HttpModule te schrijven en die module vervolgens in de aanvraagpijplijn aan te sluiten. U hoeft de code van uw toepassing niet te wijzigen om de informatie te verkrijgen die u nodig hebt.

Het bijgevoegde voorbeeld werkt in de Microsoft .NET Framework 1.1 en de .NET Framework 2.0 en bevat overal opmerkingen. Het voorbeeld bevat de volgende bestanden:

  • FormsAuthEvents.cs: de klasse waarmee IHttpModule wordt geïmplementeerd en wordt gekoppeld aan de gebeurtenis Application_BeginRequest.

  • FormsAuthInfo.cs: de klasse die de cookie ophaalt en het formulierverificatieticket ontsleutelt. Ook wordt het Web.config-bestand van de toepassing gecontroleerd om ervoor te zorgen dat formulierverificatie is ingeschakeld.

  • FormsAuthConfig.cs: de klasse die informatie leest uit het FormsAuthLogger.config-bestand.

  • Log.cs: het bestand dat een stringbuilder accepteert en de waarden naar een logboekbestand schrijft.

  • FormsAuthLogger.config: het XML-bestand dat wordt gelezen door het bestand Log.cs. Dit bestand moet zich in de map /bin bevinden met het ingebouwde DLL-bestand. Met het bestand kunt u het volgende configureren:

    • Filteren op IP: u kunt het vastleggen van gegevens filteren op client-IP. Op deze manier kunt u alleen aanvragen registreren van een client die het probleem reproduceert. Dit vermindert de grootte van het logboek.

    • Type opname: hiermee geeft u aan waar het bestand moet worden opgeslagen. De standaardinstelling is de map Tijdelijke ASP.NET Bestanden, maar u kunt deze overal opslaan zolang het werkprocesaccount de mogelijkheid heeft om naar de map te schrijven.

Opmerking Ik geef een downloadkoppeling op voor de code die is opgegeven in het FormsAuthLogger.zip-bestand.

Ik zal hier de belangrijkste gebieden aanwijzen:

  1. Maak een klasse waarmee de interface IHttpModule wordt geïmplementeerd.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Bekabel de gebeurtenis die u wilt bekijken. In dit voorbeeld gebruiken we de gebeurtenis Application_BeginRequest. Op deze manier kunnen we elke aanvraag onderzoeken en bepalen of deze de formulierverificatiecooky heeft en de FormsAuthenticationTicket registreren als de cookie er is.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Implementeer de gebeurtenis Application_BeginRequest.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Haal de formulierverificatiecooky op en ontsleutel deze vervolgens.

  5. Registreer de waarden. Ik raad aan om naast de formuliergegevens het volgende te registreren. Dit helpt u bij het instellen van uw formulierverificatiegegevens in de IIS-logboeken, indien nodig:

    • Datum: hiermee kunt u zien wanneer de aanvraag is binnengekomen.

    • RequestType: geeft aan of de aanvraag een Get of een Post is.

    • URL: toont het patroon van aanvragen dat tot het probleem heeft geleid.

    • Referrer

    • ClientIP: hiermee worden de aanvragen aan een specifieke client gekoppeld.

Meer hulp nodig?

Meer opties?

Verken abonnementsvoordelen, blader door trainingscursussen, leer hoe u uw apparaat kunt beveiligen en meer.

Community's helpen u vragen te stellen en te beantwoorden, feedback te geven en te leren van experts met uitgebreide kennis.

Was deze informatie nuttig?

Hoe tevreden bent u met de taalkwaliteit?
Wat heeft uw ervaring beïnvloed?
Als u op Verzenden klikt, wordt uw feedback gebruikt om producten en services van Microsoft te verbeteren. Uw IT-beheerder kan deze gegevens verzamelen. Privacyverklaring.

Hartelijk dank voor uw feedback.

×