Kimlik Doğrulamayı İşleme
Bazı proxy'ler ve sunucular, İnternet'te kaynaklara erişim vermeden önce kimlik doğrulaması gerektirir. WinINet işlevleri http oturumları için sunucu ve proxy kimlik doğrulamasını destekler. Ftp sunucularının kimlik doğrulaması InternetConnect işlevi tarafından işlenmelidir. Şu anda FTP ağ geçidi kimlik doğrulaması desteklenmiyor.
HTTP Kimlik Doğrulaması hakkında
Kimlik doğrulaması gerekiyorsa istemci uygulaması, sunucu kimlik doğrulaması gerektiriyorsa 401 veya proxy kimlik doğrulaması gerektiriyorsa 407 durum kodunu alır. Durum koduyla, proxy veya sunucu bir veya daha fazla kimlik doğrulaması yanıt üst bilgisi gönderir:Proxy-Authenticate (proxy kimlik doğrulaması için) veya WWW-Authenticate (sunucu kimlik doğrulaması için).
Her kimlik doğrulama yanıt üst bilgisi, kullanılabilir bir kimlik doğrulama düzeni ve bir alan içerir. Birden çok kimlik doğrulama düzeni destekleniyorsa, sunucu birden çok kimlik doğrulama yanıtı üst bilgisi döndürür. Alan değeri harf duyarlıdır ve ara sunucuda veya sunucuda bir koruma alanı oluşturur. Örneğin, "WWW-Authenticate: Basic Realm="example"" üst bilgisi, sunucu kimlik doğrulaması gerektiğinde döndürülen bir üst bilgi örneği olabilir.
İsteği gönderen istemci uygulaması, istekle birlikte bir Yetkilendirme üst bilgisi alanı ekleyerek kimliğini doğrulayabilir. Yetkilendirme üst bilgisi, kimlik doğrulama düzenini ve bu düzen için gereken uygun yanıtı içerir. Örneğin, "Yetkilendirme: Temel <kullanıcı adı:parola>" üst bilgisi isteğe eklenir ve istemci "WWW-Authenticate: Basic Realm="example" kimlik doğrulaması yanıt üst bilgisini aldıysa sunucuya yeniden gönderilir.
İki genel kimlik doğrulama düzeni türü vardır:
- Kullanıcı adı ve parolanın sunucuya düz metin olarak gönderildiği temel kimlik doğrulama düzeni.
- Sınama yanıtı biçimi sağlayan sınama yanıtı düzenleri.
Temel kimlik doğrulama düzeni, bir istemcinin her bölge için bir kullanıcı adı ve parola ile kimliğini doğrulaması gereken modeli temel alır. Sunucu, geçerli bir kullanıcı adı ve parola içeren bir Yetkilendirme üst bilgisi ile yineleniyorsa isteği sunar.
Sınama yanıtı düzenleri daha güvenli kimlik doğrulaması sağlar. İstek sınama yanıtı şeması kullanılarak kimlik doğrulaması gerektiriyorsa, istemciye uygun durum kodu ve Kimlik doğrulaması üst bilgileri döndürülür. İstemcinin daha sonra isteği bir müzakere ile yeniden göndermesi gerekir. Sunucu sınaması olan uygun bir durum kodu döndürür ve istemcinin istenen hizmeti almak için isteği uygun yanıtla yeniden göndermesi gerekir.
Aşağıdaki tabloda kimlik doğrulama düzenleri, kimlik doğrulama türü, bunları destekleyen DLL ve şemanın açıklaması listelemektedir.
Tertip etmek | Tür | DLL | Açıklama |
---|---|---|---|
Temel (düz metin) | temel | Wininet.dll | Kullanıcı adı ve parolayı içeren base64 kodlu bir dize kullanır. |
Derleme | sınama yanıtı | Digest.dll | Nonce (sunucu tarafından belirtilen veri dizesi) değerinin kullanılmasını zorlayan bir sınama yanıtı düzeni. Kullanıcı adı, parola, verilen nonce değeri, HTTP yöntemi ve istenen Tekdüzen Kaynak Tanımlayıcısı (URI) öğelerini içeren bir sağlama toplamı içeren yanıt geçerlidir. Microsoft Internet Explorer 5'te Digest kimlik doğrulaması desteği tanıtıldı. |
NT LAN Manager (NTLM) | meydan okuma-cevap | Winsspi.dll | Sınamayı kullanıcı adına göre temel alan bir sınama yanıtı düzeni. |
Microsoft Network (MSN) | sınama yanıtı | Msnsspc.dll | Microsoft Network'ün kimlik doğrulama düzeni. |
Dağıtılmış Parola Kimlik Doğrulaması (DPA) | sınama yanıtı | Msapsspc.dll | MSN kimlik doğrulamasına benzer ve Microsoft Network tarafından da kullanılır. |
Uzaktan Parola Kimlik Doğrulaması (RPA) | CompuServe | Rpawinet.dll, da.dll | CompuServe kimlik doğrulama düzeni. Daha fazla bilgi için bkz. RPA Mekanizma Belirtimleri. |
Temel kimlik doğrulaması dışındaki her şey için, uygun DLL'yi yüklemeye ek olarak kayıt defteri anahtarlarının ayarlanması gerekir.
Kimlik doğrulaması gerekiyorsa, HttpOpenRequestçağrısında INTERNET_FLAG_KEEP_CONNECTION bayrağı kullanılmalıdır. INTERNET_FLAG_KEEP_CONNECTION bayrağı, kimlik doğrulama işlemini tamamlarken bağlantıyı korumak için NTLM ve diğer kimlik doğrulama türleri için gereklidir. Bağlantı sağlanmazsa, kimlik doğrulama işlemi ara sunucu veya sunucuyla yeniden başlatılmalıdır.
InternetOpenUrl ve HttpSendRequest işlevleri, kimlik doğrulaması gerektiğinde bile başarıyla tamamlanır. Aradaki fark, üst bilgi dosyalarında ve internetreadfiledöndürülen verilerin kullanıcıya durum kodunu bildiren bir HTML sayfası almasıdır.
Kimlik Doğrulama Anahtarlarını Kaydetme
INTERNET_OPEN_TYPE_PRECONFIG ProxyEnable , ProxyServerve ProxyOverridekayıt defteri değerlerine bakar. Bu değerler HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settingsaltında bulunur.
Temel dışındaki kimlik doğrulama düzenleri için, Microsoft\Internet Explorer\SecurityHKEY_LOCAL_MACHINE\SOFTWARE\altında kayıt defterine bir anahtar eklenmelidir. Bir DWORD değeri, Bayraklar, uygun değerle ayarlanmalıdır. Aşağıdaki listede, Bayrakları değeri için olası değerler gösterilir.
PLUGIN_AUTH_FLAGS_UNIQUE_CONTEXT_PER_TCPIP (value=0x01)
Her İletim Denetimi Protokolü/İnternet Protokolü (TCP/IP) yuvası farklı bir bağlam içerir. Aksi takdirde, her alan veya blok URL şablonu için yeni bir bağlam geçirilir.
PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI (value=0x02)
Bu DLL kendi kullanıcı girişini işleyebilir.
PLUGIN_AUTH_FLAGS_CAN_HANDLE_NO_PASSWD (value=0x04)
Bu DLL, kullanıcıdan parola istemeden kimlik doğrulaması gerçekleştirebilir.
PLUGIN_AUTH_FLAGS_NO_REALM (value=0x08)
Bu DLL standart bir http bölgesi dizesi kullanmaz. Bir bölge gibi görünen tüm veriler şemaya özgü verilerdir.
PLUGIN_AUTH_FLAGS_KEEP_ALIVE_NOT_REQUIRED (value=0x10)
Bu DLL, sınama yanıtı dizisi için kalıcı bir bağlantı gerektirmez.
Örneğin, NTLM kimlik doğrulaması eklemek için NTLM anahtarı HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Securitykonumuna eklenmelidir. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Security\NTLMaltında dize değeri, DLLFileve DWORD değeri Bayraklareklenmelidir. DLLFile Winsspi.dllolarak ayarlanmalıdır ve Bayraklar 0x08 olarak ayarlanmalıdır.
Sunucu Kimlik Doğrulaması
Bir sunucu kimlik doğrulaması gerektiren bir istek aldığında, sunucu bir 401 durum kodu iletisi döndürür. Bu iletide, sunucu bir veya daha fazla WWW-Authenticate yanıt üst bilgisi içermelidir. Bu üst bilgiler, sunucunun kullanabileceği kimlik doğrulama yöntemlerini içerir. WinINet tanıdığı ilk yöntemi seçer.
Temel kimlik doğrulaması, kanal ilk olarak SSL veya PCT ile bağlantıyla şifrelenmediği sürece zayıf güvenlik sağlar.
InternetErrorDlg işlevi, kullanıcıdan kullanıcı adı ve parola verilerini almak için kullanılabilir veya verileri almak için özelleştirilmiş bir kullanıcı arabirimi tasarlanabilir.
Özel arabirim, INTERNET_OPTION_PASSWORD ve INTERNET_OPTION_USERNAME değerlerini ayarlamak ve ardından isteği sunucuya yeniden göndermek için InternetSetOption işlevini kullanabilir.
Proxy Kimlik Doğrulaması
İstemci kimlik doğrulaması gerektiren bir ara sunucu kullanmayı denediğinde, proxy istemciye 407 durum kodu iletisi döndürür. Bu iletide, ara sunucu bir veya daha fazla Proxy-Authenticate yanıt üst bilgisi içermelidir. Bu üst bilgiler ara sunucudaki kullanılabilir kimlik doğrulama yöntemlerini içerir. WinINet tanıdığı ilk yöntemi seçer.
InternetErrorDlg işlevi, kullanıcıdan kullanıcı adı ve parola verilerini almak için kullanılabilir veya özelleştirilmiş bir kullanıcı arabirimi tasarlanabilir.
Özel arabirim, INTERNET_OPTION_PROXY_PASSWORD ve INTERNET_OPTION_PROXY_USERNAME değerlerini ayarlamak ve ardından isteği ara sunucuya yeniden göndermek için InternetSetOption işlevini kullanabilir.
Hiçbir proxy kullanıcı adı ve parolası ayarlı değilse, WinINet sunucu için kullanıcı adını ve parolayı kullanmayı dener. Bu davranış istemcilerin sunucu kimlik doğrulamasını işlemek için kullanılan özelleştirilmiş kullanıcı arabirimini uygulamasına olanak tanır.
HTTP Kimlik Doğrulamayı İşleme
HTTP kimlik doğrulaması, InternetErrorDlg veya InternetSetOption kullanan veya kendi kimlik doğrulama üst bilgilerini ekleyen özelleştirilmiş bir işlevle işlenebilir. InternetErrorDlg, ara sunucu veya sunucudan gelen durum kodları gibi gizli hataları bulmak için HINTERNET tanıtıcısıyla ilişkili üst bilgileri inceleyebilir. InternetSetOption, ara sunucu ve sunucu için kullanıcı adını ve parolayı ayarlamak için kullanılabilir. MSN ve DPA kimlik doğrulaması için, kullanıcı adını ve parolayı ayarlamak için InternetErrorDlgkullanılmalıdır.
Kendi WWW-Authenticate veya Proxy-Authenticate üst bilgilerini ekleyen özelleştirilmiş işlevler için INTERNET_FLAG_NO_AUTH bayrağı kimlik doğrulamasını devre dışı bırakmak üzere ayarlanmalıdır.
Aşağıdaki örnek, HTTP kimlik doğrulamasını işlemek için InternetErrorDlgnasıl kullanılabileceğini gösterir.
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.
Örnekte, HttpSendRequestçağrısıyla ilişkili hataları depolamak için dwErrorCode kullanılmıştır. HttpSendRequest, proxy veya sunucu kimlik doğrulaması gerektirse bile başarıyla tamamlanmaktadır. FLAGS_ERROR_UI_FILTER_FOR_ERRORS bayrağı InternetErrorDlgverildiğinde, işlev herhangi bir gizli hata için başlıkları denetler. Bu gizli hatalar, kimlik doğrulaması isteklerini içerir. InternetErrorDlg, kullanıcıdan gerekli verileri istemesi için uygun iletişim kutusunu görüntüler. FLAGS_ERROR_UI_FLAGS_GENERATE_DATA ve FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS bayrakları da InternetErrorDlggeçirilmelidir, böylece işlev hata için uygun veri yapısını oluşturur ve iletişim kutusunun sonuçlarını HINTERNET tanıtıcısında depolar.
Aşağıdaki örnek kod, InternetSetOptionkullanılarak kimlik doğrulamasının nasıl işleneceğini gösterir.
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.
Dikkat
WinINet, sunucu uygulamalarını desteklemez. Ayrıca, bir hizmet aracılığıyla kullanılmamalıdır. Sunucu uygulamaları veya hizmetleri için Microsoft Windows HTTP Services (WinHTTP)kullanın.