在 Web API 中使用 SSL

數個常見的驗證配置在純 HTTP 上並不安全。 尤其是,基本驗證和表單驗證會傳送未加密的認證。 若要安全,這些驗證配置 必須使用 SSL。 此外,SSL 用戶端憑證也可以用來驗證用戶端。

在伺服器上啟用 SSL

若要在 IIS 7 或更新版本中設定 SSL:

  • 建立或取得憑證。 若要進行測試,您可以建立自我簽署憑證。
  • 新增 HTTPS 系結。

如需詳細資訊,請參閱 如何在 IIS 7 上設定 SSL

針對本機測試,您可以從 Visual Studio 在 IIS Express中啟用 SSL。 在屬性視窗中,將 [已啟用 SSL]設定為[True]。 請注意 SSL URL的值;使用此 URL 來測試 HTTPS 連線。

屬性中已啟用 S L 的影像

在 Web API 控制器中強制執行 SSL

如果您有 HTTPS 和 HTTP 系結,用戶端仍然可以使用 HTTP 來存取網站。 您可以允許透過 HTTP 取得某些資源,而其他資源則需要 SSL。 在此情況下,請使用動作篩選準則來要求受保護資源的 SSL。 下列程式碼顯示會檢查 SSL 的 Web API 驗證篩選︰

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);
        }
    }
}

將此篩選新增至任何需要 SSL 的 Web API 動作︰

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

SSL 用戶端憑證

SSL 會使用公開金鑰基礎結構憑證來提供驗證。 伺服器必須提供向用戶端驗證服務器的憑證。 用戶端將憑證提供給伺服器較不常見,但這是驗證用戶端的一個選項。 若要搭配 SSL 使用用戶端憑證,您需要將已簽署的憑證散發給使用者的方法。 對於許多應用程式類型而言,這不會是良好的使用者體驗,但在某些環境中 (例如,企業) 可能可行。

優點 缺點
- 憑證認證比使用者名稱/密碼更強。 - SSL 提供完整的安全通道,其中包含驗證、訊息完整性和訊息加密。 - 您必須取得和管理 PKI 憑證。 - 用戶端平臺必須支援 SSL 用戶端憑證。

若要設定 IIS 以接受用戶端憑證,請開啟 IIS 管理員並執行下列步驟:

  1. 按一下樹狀檢視中的月臺節點。

  2. 按兩下中間窗格中的 [SSL 設定] 功能。

  3. [用戶端憑證] 底下,選取下列其中一個選項:

    • 接受:IIS 會接受來自用戶端的憑證,但不需要憑證。
    • 需要:需要用戶端憑證。 (若要啟用此選項,您也必須選取 [需要 SSL] )

您也可以在ApplicationHost.config檔案中設定這些選項:

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

SslNegotiateCert旗標表示 IIS 會接受來自用戶端的憑證,但不需要一個 (相當於 IIS 管理員) 中的 [接受] 選項。 若要要求憑證,請設定 SslRequireCert 旗標。 若要進行測試,您也可以在位於 「Documents\IISExpress\config」 的本機applicationhost.Config檔案中,于 IIS Express 中設定這些選項。

建立用於測試的用戶端憑證

為了進行測試,您可以使用 MakeCert.exe 來建立用戶端憑證。 首先,建立測試根目錄授權單位:

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

Makecert 會提示您輸入私密金鑰的密碼。

接下來,將憑證新增至測試伺服器的「受信任的根憑證授權單位」存放區,如下所示:

  1. 開啟 MMC。
  2. 在 [ 檔案]底下,選取 [新增/移除嵌入式管理單元]。
  3. 選取 [電腦帳戶]。
  4. 選取 [本機電腦 ],然後完成精靈。
  5. 在流覽窗格中,展開 [受信任的根憑證授權單位] 節點。
  6. 在 [ 動作 ] 功能表上,指向 [ 所有工作],然後按一下 [ 入] 以啟動 [憑證匯入精靈]。
  7. 流覽至憑證檔案 TempCA.cer。
  8. 按一下 [開啟],然後按一下 [ 下一步 ] 並完成精靈。 (系統會提示您重新輸入 password.)

現在,建立第一個憑證所簽署的用戶端憑證:

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 中使用用戶端憑證

在伺服器端,您可以在要求訊息上呼叫 GetClientCertificate 來取得用戶端憑證。 如果沒有用戶端憑證,方法會傳回 null。 否則,它會傳回 X509Certificate2 實例。 使用此物件可從憑證取得資訊,例如簽發者和主體。 然後,您可以使用這項資訊進行驗證和/或授權。

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