HTTP 基本認證 是 HTTP 協定內建的簡單驗證機制,雖安全性有限,但理解其原理與實作是學習進階認證 (Digest、OAuth、JWT) 的基石。
WWW-Authenticate: Basic realm="MyRealm"。username:password 以 Base64 編碼 放入 Authorization: Basic <base64> 標頭重發請求。
結論:生產環境必須搭配 HTTPS,否則極度不安全。HTTPS 下可接受用於簡單內部 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') }
});
| 措施 | 說明 |
|---|---|
| 強制 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,基本認證僅作為學習基石或極受限環境臨時方案。