驗證 RESTful Web 服務

HTTP 支援使用數種驗證機制來控制資源的存取。 基本身份驗證僅提供資源存取權給具有正確認證的用戶端。 本文示範如何使用基本身份驗證來保護 RESTful Web 服務資源的存取。

注意

在 iOS 9 和更新版本中,應用程式傳輸安全性 (ATS) 會強制執行因特網資源(例如應用程式後端伺服器)與應用程式之間的安全連線,以防止意外洩漏敏感性資訊。 由於 ATS 預設會在針對 iOS 9 建置的應用程式中啟用,因此所有連線都會受限於 ATS 安全性需求。 如果連線不符合這些需求,它們將會失敗併發生例外狀況。 如果無法使用 HTTPS 通訊協議和保護因特網資源的通訊,則可以退出宣告 ATS。 您可以藉由更新應用程式的 Info.plist 檔案來達成此目的。 如需詳細資訊,請參閱 應用程式傳輸安全性

透過 HTTP 驗證使用者

基本身份驗證是 HTTP 支援的最簡單驗證機制,且牽涉到用戶端將使用者名稱和密碼傳送為未加密的 base64 編碼文字。 其運作方式如下:

  • 如果 Web 服務收到受保護資源的要求,它會拒絕 HTTP 狀態代碼為 401(拒絕存取)的要求,並設定 WWW-Authenticate 回應標頭,如下圖所示:

Basic Authentication Failing

  • 如果 Web 服務收到受保護資源的要求,且 Authorization 標頭已正確設定,Web 服務會以 HTTP 狀態代碼 200 回應,這表示要求成功,且要求的資訊位於回應中。 下圖顯示此案例:

Basic Authentication Succeeding

注意

基本身份驗證只能透過 HTTPS 連線使用。 透過 HTTP 連線使用時, Authorization 攻擊者擷取 HTTP 流量時,可以輕鬆地將標頭譯碼。

在 Web 要求中指定基本身份驗證

基本身份驗證的使用指定如下:

  1. 字串串 “Basic” 會新增至 Authorization 要求的標頭。
  2. 使用者名稱和密碼會合併成字串,格式為 「username:password」,然後以base64編碼並新增至 Authorization 要求的標頭。

因此,標頭的使用者名稱為 'XamarinUser' 和 'XamarinPassword' 的密碼會變成:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

類別HttpClient可以在 屬性上HttpClient.DefaultRequestHeaders.Authorization設定Authorization標頭值。 HttpClient由於實例存在於多個要求之間,Authorization因此標頭只需要設定一次,而不是在提出每個要求時,如下列程式代碼範例所示:

public class RestService : IRestService
{
  HttpClient _client;
  ...

  public RestService ()
  {
    var authData = string.Format ("{0}:{1}", Constants.Username, Constants.Password);
    var authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));

    _client = new HttpClient ();
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Basic", authHeaderValue);
  }
  ...
}

然後,當對 Web 服務作業提出要求時,要求會以 Authorization 標頭簽署,指出使用者是否有叫用作業的許可權。

重要

雖然此程式代碼會將認證儲存為常數,但不應以不安全的格式儲存在已發佈的應用程式中。

處理授權標頭伺服器端

REST 服務應該使用 [BasicAuthentication] 屬性裝飾每個動作。 這個屬性是用來剖析標頭,Authorization並藉由比較base64編碼認證是否有效,與儲存在Web.config中的值進行比較。雖然此方法適用於範例服務,但需要擴充公開的 Web 服務。

在 IIS 所使用的基本驗證模組中,用戶會根據其 Windows 認證進行驗證。 因此,用戶必須在伺服器的網域上擁有帳戶。 不過,基本身份驗證模型可以設定為允許自定義驗證,其中使用者帳戶會針對外部來源進行驗證,例如資料庫。 如需詳細資訊,請參閱 ASP.NET 網站上的 ASP.NET Web API 中的基本身份驗證。

注意

基本身份驗證並非設計用來管理註銷。因此,註銷的標準基本身份驗證方法是結束會話。