首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET Web API 安全驗證系列(二):HTTP 基本認證實作與安全性考量

     編輯:關於ASP.NET

ASP.NET Web API 安全驗證系列(二):HTTP 基本認證實作與安全性考量

HTTP 基本認證 是 HTTP 協定內建的簡單驗證機制,雖安全性有限,但理解其原理與實作是學習進階認證 (Digest、OAuth、JWT) 的基石。

基本認證運作原理

  1. 用戶端請求受保護資源 (無 Authorization 標頭)。
  2. 伺服器回應 401 Unauthorized,附帶 WWW-Authenticate: Basic realm="MyRealm"。
  3. 用戶端提示輸入帳號密碼,將 username:password 以 Base64 編碼 放入 Authorization: Basic <base64> 標頭重發請求。
  4. 伺服器解碼、驗證,成功回 200 + 資源,失敗回 401。

基本認證流程圖

安全性缺陷

  • Base64 非加密:極易解碼,等同明文傳輸密碼。
  • 無防重放機制:攔截封包即可重放請求。
  • 無伺服器身分驗證:用戶端無法確認伺服器真偽 (需 HTTPS 解決)。
  • 瀏覽器快取憑證:登出困難,無標準登出機制。

結論:生產環境必須搭配 HTTPS,否則極度不安全。HTTPS 下可接受用於簡單內部 API、測試環境。

Web API 實作基本認證濾波器


public class BasicAuthenticationAttribute : AuthorizationFilterAttribute {
    private readonly string _realm;
    public BasicAuthenticationAttribute(string realm = "DefaultRealm") { _realm = realm; }

    public override void OnAuthorization(HttpActionContext actionContext) {
        var authHeader = actionContext.Request.Headers.Authorization;
        if (authHeader == null || authHeader.Scheme != "Basic") {
            Challenge(actionContext);
            return;
        }

        // 解碼 Base64
        string credentials;
        try {
            credentials = Encoding.Default.GetString(Convert.FromBase64String(authHeader.Parameter));
        } catch {
            Challenge(actionContext);
            return;
        }

        // 分割 username:password
        var parts = credentials.Split(new[] { ':' }, 2);
        if (parts.Length != 2) { Challenge(actionContext); return; }
        string username = parts[0];
        string password = parts[1];

        // 驗證邏輯 (實際應查詢資料庫/Identity)
        if (!ValidateUser(username, password)) {  // TODO: 實作
            Challenge(actionContext);
            return;
        }

        // 設定 Principal
        var principal = new GenericPrincipal(new GenericIdentity(username), null);
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null) HttpContext.Current.User = principal;
    }

    private void Challenge(HttpActionContext actionContext) {
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        actionContext.Response.Headers.WwwAuthenticate.Add(
            new AuthenticationHeaderValue("Basic", string.Format("realm=\"{0}\"", _realm)));
    }

    private bool ValidateUser(string username, string password) {
        // 範例:硬編碼驗證,實際應用安全密碼雜湊驗證
        return username == "Parry" && password == "123456";
    }
}

控制器套用


// 整個控制器
[BasicAuthenticationAttribute("MyApiRealm")]
public class ValuesController : ApiController { ... }

// 單一動作
[BasicAuthenticationAttribute]
public IHttpActionResult GetSecret() { ... }

用戶端呼叫範例


// .NET HttpClient
var client = new HttpClient();
var credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes("Parry:123456"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
var response = await client.GetAsync("https://api.example.com/values");

// JavaScript Fetch
fetch('https://api.example.com/values', {
    headers: { 'Authorization': 'Basic ' + btoa('Parry:123456') }
});

進階安全強化 (若必須使用 Basic Auth)

措施說明
強制 HTTPS傳輸層加密,防竊聽/竄改
密碼雜湊儲存資料庫儲存 bcrypt/Argon2 雜湊,驗證時比對雜湊
短效存取權杖Basic Auth 登入換發 JWT,後續 API 用 Bearer Token
速率限制防暴力破解,IP/帳號鎖定
審計日誌記錄登入成功/失敗、IP、User-Agent

現代替代方案對比

方案安全性複雜度適用場景
Basic Auth + HTTPS中低簡單內部服務、測試、IoT 裝置受限環境
Digest Auth中高高無法部署 HTTPS 的舊系統 (不推薦新專案)
API Key中低服務間呼叫、公開唯讀 API
JWT Bearer Token高中現代 SPA、行動App、微服務、標準首選
OAuth 2.0 / OIDC最高高第三方登入、授權碼流程、企業級 SSO

總結

HTTP 基本認證以 Base64 編碼憑證 實現簡單驗證,本質不安全,生產環境必須搭配 HTTPS。Web API 中透過 AuthorizationFilterAttribute 實作濾波器攔截驗證。現代專案應採用 JWT Bearer Token + HTTPS 或 OAuth 2.0/OIDC,基本認證僅作為學習基石或極受限環境臨時方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved