Web API'de SSL ile çalışmaWorking with SSL in Web API

, Mike te sonby Mike Wasson

Birkaç ortak kimlik doğrulama şeması, düz HTTP üzerinden güvenli değildir.Several common authentication schemes are not secure over plain HTTP. Özellikle, temel kimlik doğrulaması ve Forms kimlik doğrulaması şifrelenmemiş kimlik bilgileri gönderir.In particular, Basic authentication and forms authentication send unencrypted credentials. Güvenli olması için, bu kimlik doğrulama düzenlerinin SSL kullanması gerekir .To be secure, these authentication schemes must use SSL. Buna ek olarak, SSL istemci sertifikaları istemcilerin kimliğini doğrulamak için de kullanılabilir.In addition, SSL client certificates can be used to authenticate clients.

Sunucuda SSL EtkinleştiriliyorEnabling SSL on the Server

IIS 7 veya sonraki sürümlerde SSL ayarlamak için:To set up SSL in IIS 7 or later:

  • Bir sertifika oluşturun veya alın.Create or get a certificate. Test için otomatik olarak imzalanan bir sertifika oluşturabilirsiniz.For testing, you can create a self-signed certificate.
  • Bir HTTPS bağlaması ekleyin.Add an HTTPS binding.

Ayrıntılar için bkz. IIS 7 ' de SSL ayarlama.For details, see How to Set Up SSL on IIS 7.

Yerel test için, Visual Studio 'dan IIS Express SSL 'yi etkinleştirebilirsiniz.For local testing, you can enable SSL in IIS Express from Visual Studio. Özellikler penceresi SSL etkin ' i trueolarak ayarlayın.In the Properties window, set SSL Enabled to True. SSL URL 'sideğerini aklınızda edin; HTTPS bağlantılarını test etmek için bu URL 'YI kullanın.Note the value of SSL URL; use this URL for testing HTTPS connections.

Web API denetleyicisinde SSL zorlamaEnforcing SSL in a Web API Controller

Hem HTTPS hem de HTTP bağlamaya sahipseniz, istemciler siteye erişmek için yine de HTTP kullanmaya devam edebilir.If you have both an HTTPS and an HTTP binding, clients can still use HTTP to access the site. Bazı kaynakların HTTP üzerinden kullanılabilir olmasını, diğer kaynaklar da SSL gerektirmesini sağlayabilirsiniz.You might allow some resources to be available through HTTP, while other resources require SSL. Bu durumda, korunan kaynaklar için SSL istemek üzere bir eylem filtresi kullanın.In that case, use an action filter to require SSL for the protected resources. Aşağıdaki kod, SSL 'yi denetleyen bir Web API kimlik doğrulama filtresi gösterir:The following code shows a Web API authentication filter that checks for 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);
        }
    }
}

Bu filtreyi SSL gerektiren herhangi bir Web API eylemlerine ekleyin:Add this filter to any Web API actions that require SSL:

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

SSL Istemci sertifikalarıSSL Client Certificates

SSL, ortak anahtar altyapısı sertifikalarını kullanarak kimlik doğrulaması sağlar.SSL provides authentication by using Public Key Infrastructure certificates. Sunucu, istemci için sunucunun kimliğini doğrulayan bir sertifika sağlamalıdır.The server must provide a certificate that authenticates the server to the client. İstemcinin sunucuya sertifika sağlaması daha yaygındır, ancak bu, istemcilerin kimliğini doğrulamak için bir seçenektir.It is less common for the client to provide a certificate to the server, but this is one option for authenticating clients. İstemci sertifikalarını SSL ile kullanmak için, imzalı sertifikaları kullanıcılarınıza dağıtmak için bir yol gerekir.To use client certificates with SSL, you need a way to distribute signed certificates to your users. Birçok uygulama türü için bu, iyi bir kullanıcı deneyimi olmayacaktır, ancak bazı ortamlarda (örneğin, kuruluş) uygulanabilir olabilir.For many application types, this will not be a good user experience, but in some environments (for example, enterprise) it may be feasible.

YararlarıAdvantages DezavantajlarDisadvantages
-Sertifika kimlik bilgileri, Kullanıcı adı/paroladan daha güçlüdür.- Certificate credentials are stronger than username/password. -SSL, kimlik doğrulama, ileti bütünlüğü ve ileti şifreleme ile tam bir güvenli kanal sağlar.- SSL provides a complete secure channel, with authentication, message integrity, and message encryption. -PKI sertifikalarını edinmeniz ve yönetmeniz gerekir.- You must obtain and manage PKI certificates. -İstemci platformun SSL istemci sertifikalarını desteklemesi gerekir.- The client platform must support SSL client certificates.

IIS 'yi istemci sertifikalarını kabul edecek şekilde yapılandırmak için, IIS Yöneticisi 'Ni açın ve aşağıdaki adımları gerçekleştirin:To configure IIS to accept client certificates, open IIS Manager and perform the following steps:

  1. Ağaç görünümündeki site düğümüne tıklayın.Click the site node in the tree view.

  2. Orta bölmedeki SSL ayarları özelliğine çift tıklayın.Double-click the SSL Settings feature in the middle pane.

  3. Istemci sertifikaları' nın altında şu seçeneklerden birini seçin:Under Client Certificates, select one of these options:

    • Kabul et: IIS istemciden bir sertifikayı kabul eder, ancak bir sertifika gerektirmez.Accept: IIS will accept a certificate from the client, but does not require one.
    • Gerektir: istemci sertifikası gerektir.Require: Require a client certificate. (Bu seçeneği etkinleştirmek için "SSL gerektir" seçeneğini de seçmeniz gerekir.(To enable this option, you must also select "Require SSL")

ApplicationHost. config dosyasında da bu seçenekleri ayarlayabilirsiniz:You can also set these options in the ApplicationHost.config file:

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

SslNegotiateCert bayrağı, IIS 'nin istemciden bir sertifikayı kabul etmesi, ancak bir tane (IIS Yöneticisi 'Nde "kabul etme" seçeneğine denktir) gerekir.The SslNegotiateCert flag means IIS will accept a certificate from the client, but does not require one (equivalent to the "Accept" option in IIS Manager). Bir sertifika istemek için SslRequireCert bayrağını ayarlayın.To require a certificate, set the SslRequireCert flag. Test için, bu seçenekleri yerel ApplicationHost içinde IIS Express de ayarlayabilirsiniz. Yapılandırma dosyası, "Documents\IISExpress\config" konumunda bulunur.For testing, you can also set these options in IIS Express, in the local applicationhost.Config file, located in "Documents\IISExpress\config".

Test için Istemci sertifikası oluşturmaCreating a Client Certificate for Testing

Sınama amacıyla, bir istemci sertifikası oluşturmak için MakeCert. exe ' yi kullanabilirsiniz.For testing purposes, you can use MakeCert.exe to create a client certificate. İlk olarak, bir test kök yetkilisi oluşturun:First, create a test root authority:

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

MakeCert, özel anahtar için bir parola girmenizi ister.Makecert will prompt you to enter a password for the private key.

Ardından, sertifikayı test sunucusunun "güvenilen kök sertifika yetkilileri" deposuna aşağıdaki gibi ekleyin:Next, add the certificate to the test server's "Trusted Root Certification Authorities" store, as follows:

  1. MMC 'YI açın.Open MMC.
  2. Dosyaaltında ek bileşen Ekle/Kaldır' ı seçin.Under File, select Add/Remove Snap-In.
  3. Bilgisayar hesabı' nı seçin.Select Computer Account.
  4. Yerel bilgisayar ' ı seçin ve Sihirbazı doldurun.Select Local computer and complete the wizard.
  5. Gezinti bölmesi altında "güvenilen kök sertifika yetkilileri" düğümünü genişletin.Under the navigation pane, expand the "Trusted Root Certification Authorities" node.
  6. Eylem menüsünde, Tüm görevler' in üzerine gelin ve ardından Içeri aktar ' a tıklayarak Sertifika Alma Sihirbazı ' nı başlatın.On the Action menu, point to All Tasks, and then click Import to start the Certificate Import Wizard.
  7. TempCA. cer sertifika dosyasına gidin.Browse to the certificate file, TempCA.cer.
  8. ' a tıklayın, ardından İleri ' ye tıklayın ve Sihirbazı doldurun.Click Open, then click Next and complete the wizard. (Parolayı yeniden girmeniz istenir.)(You will be prompted to re-enter the password.)

Şimdi ilk sertifika tarafından imzalanmış bir istemci sertifikası oluşturun:Now create a client certificate that is signed by the first certificate:

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

Web API 'de Istemci sertifikalarını kullanmaUsing Client Certificates in Web API

Sunucu tarafında, istek iletisinde GetClientCertificate çağırarak istemci sertifikasını alabilirsiniz.On the server side, you can get the client certificate by calling GetClientCertificate on the request message. Yöntemi, istemci sertifikası yoksa null değerini döndürür.The method returns null if there is no client certificate. Aksi halde, bir X509Certificate2 örneği döndürür.Otherwise, it returns an X509Certificate2 instance. Sertifikadan veren ve konu gibi bilgileri almak için bu nesneyi kullanın.Use this object to get information from the certificate, such as the issuer and subject. Daha sonra bu bilgileri kimlik doğrulaması ve/veya yetkilendirme için kullanabilirsiniz.Then you can use this information for authentication and/or authorization.

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;