1. 程式人生 > >Web驗證方式--Http Basic Authentication

Web驗證方式--Http Basic Authentication

分享 user omr figure org www gen 一起 host

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一起使用來保證安全性。

Web驗證方式--Http Basic Authentication