Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Voor sommige proxy's en servers is verificatie vereist voordat toegang wordt verleend tot resources op internet. De WinINet-functies ondersteunen server- en proxyverificatie voor http-sessies. Verificatie van FTP-servers moet worden verwerkt door de functie InternetConnect. Momenteel wordt FTP-gatewayverificatie niet ondersteund.
Over HTTP-verificatie
Als verificatie is vereist, ontvangt de clienttoepassing een statuscode 401, als de server verificatie vereist of 407, als de proxy verificatie vereist. Met de statuscode verzendt de proxy of server een of meer antwoordheaders(Proxy-Authenticate (voor proxyverificatie) of WWW-Authenticate (voor serververificatie).
Elke verificatieantwoordheader bevat een beschikbaar verificatieschema en een realm. Als er meerdere verificatieschema's worden ondersteund, retourneert de server meerdere verificatieantwoordheaders. De realmwaarde is hoofdlettergevoelig en definieert een beveiligingsruimte op de proxy of server. De header WWW-Authenticate: Basic Realm="example" is bijvoorbeeld een voorbeeld van een header die wordt geretourneerd wanneer serververificatie is vereist.
De clienttoepassing die de aanvraag heeft verzonden, kan zichzelf verifiëren door een veld autorisatieheader op te vragen bij de aanvraag. De autorisatieheader bevat het verificatieschema en het juiste antwoord dat door dat schema is vereist. De header 'Autorisatie: Basic <gebruikersnaam:wachtwoord>' wordt bijvoorbeeld toegevoegd aan de aanvraag en opnieuw verzonden naar de server als de client de header voor het verifiëren-antwoord "WWW-Authenticate: Basic Realm="example" heeft ontvangen.
Er zijn twee algemene typen verificatieschema's:
- Basisverificatieschema, waarbij de gebruikersnaam en het wachtwoord in duidelijke tekst naar de server worden verzonden.
- Challenge-response-schema's, die een indeling voor een uitdagingsreactie mogelijk maken.
Het basisverificatieschema is gebaseerd op het model dat een client zichzelf moet verifiëren met een gebruikersnaam en wachtwoord voor elke realm. De server services de aanvraag als deze opnieuw wordt verzonden met een autorisatieheader die een geldige gebruikersnaam en een geldig wachtwoord bevat.
Challenge-response-schema's maken veiligere verificatie mogelijk. Als voor een aanvraag verificatie is vereist met behulp van een challenge-response-schema, worden de juiste statuscode en verificatieheaders geretourneerd naar de client. De client moet vervolgens de aanvraag opnieuw verzenden om een onderhandeling aan te gaan. De server retourneert een geschikte statuscode met een uitdaging en de client moet de aanvraag vervolgens opnieuw verzenden met de juiste reactie om de aangevraagde service op te halen.
De volgende tabel bevat verificatieschema's, het verificatietype, het DLL-bestand dat deze ondersteunt en een beschrijving van het schema.
| Schema | Type | DLL | Beschrijving |
|---|---|---|---|
| Basis (duidelijke tekst) | basisch | Wininet.dll | Maakt gebruik van een met Base64 gecodeerde tekenreeks die de gebruikersnaam en het wachtwoord bevat. |
| Samenvatting | uitdaging-reactie | Digest.dll | Een challenge-response-schema dat gebruikmaakt van een nonce (een door de server opgegeven gegevensreeks) waarde. Een geldig antwoord bevat een controlesom van de gebruikersnaam, het wachtwoord, de opgegeven niet-cewaarde, de HTTP-methode en de aangevraagde URI (Uniform Resource Identifier). Ondersteuning voor digest-verificatie is geïntroduceerd in Microsoft Internet Explorer 5. |
| NT LAN Manager (NTLM) | uitdaging-reactie | Winsspi.dll | Een challenge-response-schema dat de uitdaging baseert op de gebruikersnaam. |
| Microsoft Network (MSN) | uitdaging-antwoord | Msnsspc.dll | Het verificatieschema van Microsoft Network. |
| Gedistribueerde wachtwoordverificatie (DPA) | uitdaging-antwoordsysteem | Msapsspc.dll | Vergelijkbaar met MSN-verificatie en wordt ook gebruikt door het Microsoft-netwerk. |
| Verificatie met externe wachtwoordzin (RPA) | CompuServe | Rpawinet.dll, da.dll | CompuServe-verificatieschema. Zie de RPA-mechanismespecificatiesvoor meer informatie. |
Voor iets anders dan basisverificatie moeten de registersleutels worden ingesteld naast het installeren van de juiste DLL.
Als verificatie is vereist, moet de INTERNET_FLAG_KEEP_CONNECTION vlag worden gebruikt in de aanroep voor HttpOpenRequest. De INTERNET_FLAG_KEEP_CONNECTION vlag is vereist voor NTLM en andere typen verificatie om de verbinding te behouden tijdens het voltooien van het verificatieproces. Als de verbinding niet wordt onderhouden, moet het verificatieproces opnieuw worden gestart met de proxy of server.
De functies InternetOpenUrl en HttpSendRequest zijn voltooid, zelfs wanneer verificatie is vereist. Het verschil is dat de gegevens die worden geretourneerd in de headerbestanden en InternetReadFile een HTML-pagina ontvangen die de gebruiker informeert over de statuscode.
Verificatiesleutels registreren
INTERNET_OPEN_TYPE_PRECONFIG kijkt naar de registerwaarden ProxyEnable, ProxyServeren ProxyOverride. Deze waarden bevinden zich onder HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings.
Voor andere verificatieschema's dan Basic moet een sleutel worden toegevoegd aan het register onder HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Security. Een DWORD--waarde, vlag, moet worden ingesteld met de juiste waarde. In de volgende lijst ziet u de mogelijke waarden voor de Vlaggen waarde.
PLUGIN_AUTH_FLAGS_UNIQUE_CONTEXT_PER_TCPIP (waarde=0x01) betekent dat er een unieke context is per TCP/IP-verbinding.
Elke TCP/IP-socket (Transmission Control Protocol/Internet Protocol) bevat een andere context. Anders wordt er een nieuwe context doorgegeven voor elke realm- of blok-URL-sjabloon.
PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI (waarde=0x02)
Deze DLL kan zijn eigen gebruikersinvoer verwerken.
PLUGIN_AUTH_FLAGS_CAN_HANDLE_NO_PASSWD (waarde=0x04)
Dit DLL-bestand kan mogelijk een verificatie uitvoeren zonder de gebruiker om een wachtwoord te vragen.
PLUGIN_AUTH_FLAGS_NO_REALM (waarde=0x08)
Deze DLL maakt geen gebruik van een standaard http realm-tekenreeks. Alle gegevens die een realm lijken te zijn, zijn schemaspecifieke gegevens.
PLUGIN_AUTH_FLAGS_KEEP_ALIVE_NOT_REQUIRED (waarde=0x10)
Voor dit DLL-bestand is geen permanente verbinding vereist voor de vraag-antwoordvolgorde.
Als u bijvoorbeeld NTLM-verificatie wilt toevoegen, moet de sleutel NTLM worden toegevoegd aan HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Security. Onder HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Security\NTLM, moet de tekenreekswaarde, DLLFile-en een DWORD--waarde, Vlaggen, worden toegevoegd. DLLFile moet worden ingesteld op Winsspi.dll, en Flags moeten worden ingesteld op 0x08.
Serververificatie
Wanneer een server een aanvraag ontvangt waarvoor verificatie is vereist, retourneert de server een 401-statuscodebericht. In dat bericht moet de server een of meer WWW-Authenticate antwoordheaders bevatten. Deze headers bevatten de verificatiemethoden die de server beschikbaar heeft. WinINet kiest de eerste methode die wordt herkend.
Basisverificatie biedt zwakke beveiliging, tenzij het kanaal eerst is versleuteld met SSL of PCT.
De InternetErrorDlg--functie kan worden gebruikt om de gebruikersnaam en wachtwoordgegevens van de gebruiker te verkrijgen, of een aangepaste gebruikersinterface kan worden ontworpen om de gegevens te verkrijgen.
Een aangepaste interface kan de functie InternetSetOption- gebruiken om de waarden voor INTERNET_OPTION_PASSWORD en INTERNET_OPTION_USERNAME in te stellen en de aanvraag vervolgens opnieuw naar de server te verzenden.
Proxy-authenticatie
Wanneer een client een proxy probeert te gebruiken waarvoor verificatie is vereist, retourneert de proxy een 407-statuscodebericht naar de client. In dat bericht moet de proxy een of meer Proxy-Authenticate antwoordheaders bevatten. Deze headers bevatten de verificatiemethoden die beschikbaar zijn via de proxy. WinINet kiest de eerste methode die wordt herkend.
De functie InternetErrorDlg kan worden gebruikt om de gebruikersnaam en wachtwoordgegevens van de gebruiker te verkrijgen, of een aangepaste gebruikersinterface kan worden ontworpen.
Een aangepaste interface kan de functie InternetSetOption gebruiken om de INTERNET_OPTION_PROXY_PASSWORD- en INTERNET_OPTION_PROXY_USERNAME-waarden in te stellen en de aanvraag vervolgens opnieuw naar de proxy te verzenden.
Als er geen proxygebruikersnaam en -wachtwoord zijn ingesteld, probeert WinINet de gebruikersnaam en het wachtwoord voor de server te gebruiken. Met dit gedrag kunnen clients dezelfde aangepaste gebruikersinterface implementeren die wordt gebruikt voor het afhandelen van serververificatie.
HTTP-verificatie verwerken
HTTP-verificatie kan worden verwerkt met InternetErrorDlg- of een aangepaste functie die gebruikmaakt van InternetSetOption- of eigen verificatieheaders toevoegt. InternetErrorDlg- kan de headers onderzoeken die zijn gekoppeld aan een HINTERNET- om verborgen fouten te vinden, zoals statuscodes van een proxy of server. InternetSetOption- kan worden gebruikt om de gebruikersnaam en het wachtwoord voor de proxy en server in te stellen. Voor MSN- en DPA-verificatie moet InternetErrorDlg- worden gebruikt om de gebruikersnaam en het wachtwoord in te stellen.
Voor aangepaste functies die een eigen WWW-Authenticate- of Proxy-Authenticate-headers toevoegen, moet de vlag INTERNET_FLAG_NO_AUTH zijn ingesteld om verificatie uit te schakelen.
In het volgende voorbeeld ziet u hoe InternetErrorDlg- kan worden gebruikt voor het afhandelen van HTTP-verificatie.
HINTERNET hOpenHandle, hConnectHandle, hResourceHandle;
DWORD dwError, dwErrorCode;
HWND hwnd = GetConsoleWindow();
hOpenHandle = InternetOpen(TEXT("Example"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
hConnectHandle = InternetConnect(hOpenHandle,
TEXT("www.server.com"),
INTERNET_INVALID_PORT_NUMBER,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,0);
hResourceHandle = HttpOpenRequest(hConnectHandle, TEXT("GET"),
TEXT("/premium/default.htm"),
NULL, NULL, NULL,
INTERNET_FLAG_KEEP_CONNECTION, 0);
resend:
HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0);
// dwErrorCode stores the error code associated with the call to
// HttpSendRequest.
dwErrorCode = hResourceHandle ? ERROR_SUCCESS : GetLastError();
dwError = InternetErrorDlg(hwnd, hResourceHandle, dwErrorCode,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
NULL);
if (dwError == ERROR_INTERNET_FORCE_RETRY)
goto resend;
// Insert code to read the data from the hResourceHandle
// at this point.
In het voorbeeld wordt dwErrorCode gebruikt om eventuele fouten op te slaan die zijn gekoppeld aan de aanroep naar HttpSendRequest. HttpSendRequest wordt met succes voltooid, zelfs als de proxy of server verificatie vereist. Wanneer de vlag FLAGS_ERROR_UI_FILTER_FOR_ERRORS wordt doorgegeven aan InternetErrorDlg, controleert de functie de headers op verborgen fouten. Deze verborgen fouten omvatten eventuele aanvragen voor verificatie. InternetErrorDlg wordt het juiste dialoogvenster getoond om de gebruiker om de nodige gegevens te vragen. De vlaggen FLAGS_ERROR_UI_FLAGS_GENERATE_DATA en FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS moeten ook worden doorgegeven aan InternetErrorDlg-, zodat de functie de juiste gegevensstructuur voor de fout samenvoegt en de resultaten van het dialoogvenster opslaat in de ACHTERNET- ingang.
In de volgende voorbeeldcode ziet u hoe verificatie kan worden verwerkt met behulp van InternetSetOption-.
HINTERNET hOpenHandle, hResourceHandle, hConnectHandle;
DWORD dwStatus;
DWORD dwStatusSize = sizeof(dwStatus);
char strUsername[64], strPassword[64];
// Normally, hOpenHandle, hResourceHandle,
// and hConnectHandle need to be properly assigned.
hOpenHandle = InternetOpen(TEXT("Example"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
hConnectHandle = InternetConnect(hOpenHandle,
TEXT("www.server.com"),
INTERNET_INVALID_PORT_NUMBER,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,0);
hResourceHandle = HttpOpenRequest(hConnectHandle, TEXT("GET"),
TEXT("/premium/default.htm"),
NULL, NULL, NULL,
INTERNET_FLAG_KEEP_CONNECTION,
0);
resend:
HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0);
HttpQueryInfo(hResourceHandle, HTTP_QUERY_FLAG_NUMBER |
HTTP_QUERY_STATUS_CODE, &dwStatus, &dwStatusSize, NULL);
switch (dwStatus)
{
// cchUserLength is the length of strUsername and
// cchPasswordLength is the length of strPassword.
DWORD cchUserLength, cchPasswordLength;
case HTTP_STATUS_PROXY_AUTH_REQ: // Proxy Authentication Required
// Insert code to set strUsername and strPassword.
// Insert code to safely determine cchUserLength and
// cchPasswordLength. Insert appropriate error handling code.
InternetSetOption(hResourceHandle,
INTERNET_OPTION_PROXY_USERNAME,
strUsername,
cchUserLength+1);
InternetSetOption(hResourceHandle,
INTERNET_OPTION_PROXY_PASSWORD,
strPassword,
cchPasswordLength+1);
goto resend;
break;
case HTTP_STATUS_DENIED: // Server Authentication Required.
// Insert code to set strUsername and strPassword.
// Insert code to safely determine cchUserLength and
// cchPasswordLength. Insert error handling code as
// appropriate.
InternetSetOption(hResourceHandle, INTERNET_OPTION_USERNAME,
strUsername, cchUserLength+1);
InternetSetOption(hResourceHandle, INTERNET_OPTION_PASSWORD,
strPassword, cchPasswordLength+1);
goto resend;
break;
}
// Insert code to read the data from the hResourceHandle
// at this point.
Notitie
WinINet biedt geen ondersteuning voor serverimplementaties. Daarnaast mag deze niet worden gebruikt vanuit een service. Voor server-implementaties of -services wordt Microsoft Windows HTTP Services (WinHTTP)gebruikt.