Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Kilka typowych schematów uwierzytelniania nie jest zabezpieczonych za pośrednictwem zwykłego protokołu HTTP. W szczególności uwierzytelnianie podstawowe i uwierzytelnianie formularzy wysyłają niezaszyfrowane poświadczenia. Aby zapewnić bezpieczeństwo, te schematy uwierzytelniania muszą używać protokołu SSL. Ponadto certyfikaty klienta SSL mogą służyć do uwierzytelniania klientów.
Włączanie protokołu SSL na serwerze
Aby skonfigurować protokół SSL w usługach IIS 7 lub nowszych:
- Utwórz lub pobierz certyfikat. Na potrzeby testowania można utworzyć certyfikat z podpisem własnym.
- Dodaj powiązanie HTTPS.
Aby uzyskać szczegółowe informacje, zobacz How to Set Up SSL on IIS 7.
Na potrzeby testowania lokalnego można włączyć protokół SSL w programie IIS Express z poziomu programu Visual Studio. W oknie Właściwości ustaw z włączoną obsługą protokołu SSL na wartość true. Zanotuj wartość adresu URL PROTOKOŁU SSL; użyj tego adresu URL do testowania połączeń HTTPS.
Wymuszanie protokołu SSL w kontrolerze internetowego interfejsu API
Jeśli masz zarówno protokół HTTPS, jak i powiązanie HTTP, klienci nadal mogą używać protokołu HTTP do uzyskiwania dostępu do lokacji. Niektóre zasoby mogą być dostępne za pośrednictwem protokołu HTTP, a inne zasoby wymagają protokołu SSL. W takim przypadku użyj filtru akcji, aby wymagać protokołu SSL dla chronionych zasobów. Poniższy kod przedstawia filtr uwierzytelniania Web API, który sprawdza, czy połączenie jest realizowane przy użyciu protokołu SSL.
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
base.OnAuthorization(actionContext);
}
}
}
Dodaj ten filtr do dowolnych akcji internetowego interfejsu API, które wymagają protokołu SSL:
public class ValuesController : ApiController
{
[RequireHttps]
public HttpResponseMessage Get() { ... }
}
Certyfikaty klienta SSL
Protokół SSL zapewnia uwierzytelnianie przy użyciu certyfikatów infrastruktury kluczy publicznych. Serwer musi podać certyfikat, który uwierzytelnia serwer na kliencie. Rzadziej klient udostępnia certyfikat serwerowi, ale jest to jedna z opcji uwierzytelniania klientów. Aby używać certyfikatów klienta z protokołem SSL, potrzebujesz sposobu dystrybuowania podpisanych certyfikatów do użytkowników. W przypadku wielu typów aplikacji nie będzie to dobre środowisko użytkownika, ale w niektórych środowiskach (na przykład w przedsiębiorstwie) może to być możliwe.
Zalety | Wady |
---|---|
Poświadczenia certyfikatów są bardziej bezpieczne niż logowanie za pomocą nazwy użytkownika i hasła. — Protokół SSL zapewnia pełny bezpieczny kanał z uwierzytelnianiem, integralnością komunikatów i szyfrowaniem komunikatów. | — Należy uzyskać certyfikaty PKI i zarządzać nimi. — Platforma kliencka musi obsługiwać certyfikaty klienta SSL. |
Aby skonfigurować usługi IIS do akceptowania certyfikatów klienta, otwórz Menedżera usług IIS i wykonaj następujące kroki:
Kliknij węzeł strony w widoku drzewa.
Kliknij dwukrotnie funkcję Ustawienia protokołu SSL w środkowym okienku.
W obszarze Certyfikaty klientawybierz jedną z następujących opcji:
- Zaakceptuj: Usługi IIS zaakceptują certyfikat od klienta, ale nie wymagają go.
- Wymagaj: wymagaj certyfikatu klienta. (Aby włączyć tę opcję, musisz również wybrać pozycję "Wymagaj protokołu SSL")
Te opcje można również ustawić w pliku ApplicationHost.config:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<!-- To require a client cert: -->
<!-- <access sslFlags="Ssl, SslRequireCert" /> -->
</security>
</system.webServer>
Flaga SslNegotiateCert oznacza, że usługi IIS zaakceptują certyfikat od klienta, ale nie wymagają jednego (odpowiednik opcji "Akceptuj" w Menedżerze usług IIS). Aby wymagać certyfikatu, ustaw flagę SslRequireCert. Na potrzeby testowania można również ustawić te opcje w programie IIS Express na lokalnym hoście aplikacji. Plik konfiguracji znajdujący się w folderze "Documents\IISExpress\config".
Tworzenie certyfikatu klienta na potrzeby testowania
Do celów testowych można użyć MakeCert.exe do utworzenia certyfikatu klienta. Najpierw utwórz testowy urząd nadrzędny:
makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer
Program Makecert wyświetli monit o wprowadzenie hasła dla klucza prywatnego.
Następnie dodaj certyfikat do magazynu "Zaufane główne urzędy certyfikacji" na serwerze testowym, wykonując następujące czynności:
- Otwórz program MMC.
- W obszarze Plikwybierz opcję Dodaj/Usuń przystawkę.
- W obszarze Dostępne przystawkiwybierz pozycję Certificates, a następnie kliknij przycisk Dodaj.
- Wybierz pozycję Konto Komputera.
- Wybierz komputer lokalny i zakończ działanie kreatora.
- W panelu nawigacji rozwiń węzeł "Zaufane główne urzędy certyfikacyjne".
- W menu akcji wskaż polecenie Wszystkie zadania, a następnie kliknij przycisk Importuj, aby uruchomić Kreatora importu certyfikatów.
- Przejdź do pliku certyfikatu, TempCA.cer.
- Kliknij Otwórz, a następnie kliknij przycisk Dalej i ukończ pracę kreatora. (Zostanie wyświetlony monit o ponowne wprowadzenie hasła).
Teraz utwórz certyfikat klienta podpisany przez pierwszy certyfikat:
makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name"
-eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk
Używanie certyfikatów klienta w internetowym interfejsie API
Po stronie serwera możesz pobrać certyfikat klienta, wywołując GetClientCertificate w komunikacie żądania. Metoda zwraca wartość null, jeśli nie ma certyfikatu klienta. W przeciwnym razie zwraca instancję X509Certificate2. Użyj tego obiektu, aby uzyskać informacje z certyfikatu, takie jak wystawca i podmiot. Następnie możesz użyć tych informacji do uwierzytelniania i/lub autoryzacji.
X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;