Http Basic Authentication是HTTP協議中定義的Web系統中的驗證方式。參考wikiweb
主要的實現機制以下:api
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對應的值爲Basicapp
realm是對web資源進行的邏輯劃分。以方便對不一樣分類的資源進行不一樣的驗證方式.這個可自行定義ui
3. web瀏覽器收到Response後會彈出對話框來讓用戶輸入用戶名及密碼。而後從新發送對web資源的請求。並將用戶輸入的驗證信息包含在Authorization頭中。編碼
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1lspa
這裏的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一塊兒使用來保證安全性。