Http Basic Authentication是HTTP協議中定義的Web系統中的驗證方式。參考wiki
主要的實現機制如下:
1. 用戶通過瀏覽器匿名訪問web資源。
2. web服務器檢測到web資源是需要已驗證的用戶才能訪問。向瀏覽器返回Response(狀態碼401)。該response會攜帶如下Header:
WWW-Authenticate: {authentication schema} realm="{The realm of the resource}"
對於該header的value:
authentication schema是表示資源采用的驗證方式,Http Basic Authentication對應的值為Basic
realm是對web資源進行的邏輯划分。以方便對不同分類的資源進行不同的驗證方式.這個可自行定義
3. web瀏覽器收到Response后會彈出對話框來讓用戶輸入用戶名及密碼。然后重新發送對web資源的請求。並將用戶輸入的驗證信息包含在Authorization頭中。
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
這里的Basic為驗證方式,而后面接着的字符串是將用戶輸入的用戶名和密碼以特定格式組合(username:name)得到的字符串進行base64編碼后得到的字符串。
4. web服務器收到新的request后會對Authorization頭進行解碼並驗證,如果驗證通過則將資源返回。否則返回401
下面通過ASP.NET Core來演示Basic驗證的實現:
首先我們假設已經有一個web api(GET http://localhost/api/values),我們需要對它實現Basic驗證。
1. 我們添加一個負責驗證的Authentication Middleware
public class AuthenticateMiddleware { private readonly RequestDelegate _next; public AuthenticateMiddleware(RequestDelegate next) { _next = next; } public Task InvokeAsync(HttpContext context) { if (context == null) { throw new System.ArgumentNullException(nameof(context)); } if(!context.Request.Headers.ContainsKey("Authorization")){ context.Response.StatusCode = 401; context.Response.Headers["WWW-Authenticate"] = "Basic realm='My Realm'"; return Task.FromResult<object>(null); } return _next.Invoke(context); } }
2. 將middleware添加到pipeline中
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } //注冊middleware app.UseMiddleware<AuthenticateMiddleware>(); app.UseHttpsRedirection(); app.UseMvc(); }
這樣我們的所有資源就被保護起來了。不過用戶輸入任何內容均可通過驗證^_^。此處僅作為演示
看看效果:
當我們訪問資源時,瀏覽器會提示我們輸入用戶名和密碼。輸入后,瀏覽器再次發送請求。並帶上Authorization頭:
然后我們就能看到所訪問資源的數據了。瀏覽器會將Authorization的值緩存一段時間(各個瀏覽器實現不一樣),然后在后續的請求中攜帶。
Basic驗證其實是很不安全的,Authorization的值僅僅做了base64編碼,但安全度很低,可以直接被反編碼。所以Basic驗證最好是於https一起使用來保證安全性。