Web驗證方式(1)--Http Basic Authentication

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

相關文章
相關標籤/搜索