Nginx集群之SSL證書的WebApi身份驗證

来源:http://www.cnblogs.com/yongfeng/archive/2017/12/02/7944301.html
-Advertisement-
Play Games

Nginx集群可以實現基於Http Basic身份驗證,通過輸入用戶、密碼,經過SSL協議的HTTPS,從而實現有效的身份驗證並訪問相應的WebApi。當然,訪問的方式不僅僅基於Http Basic一種,還可以通過令牌token的方式進行訪問,又或者基於redis實現單點登錄的訪問,本文主要講述的是... ...


目錄

1       大概思路... 1

2       Nginx集群之SSL證書的WebApi身份驗證... 1

3       AuthorizeAttribute類... 2

4       Openssl生成SSL證書... 2

5       編寫.NET WebApi 2

6       部署WebApi到區域網內3台PC機... 5

7       Nginx集群配置搭建... 6

8       運行結果... 7

9       總結... 9

1       大概思路

l  Nginx集群之SSL證書的WebApi身份驗證

l  AuthorizeAttribute類

l  Openssl生成SSL證書

l  編寫.NET WebApi

l  部署WebApi到區域網內3台PC機

l  Nginx集群配置搭建

l  運行結果

l  總結

2       Nginx集群之SSL證書的WebApi身份驗證

Nginx集群可以實現基於Http Basic身份驗證,通過輸入用戶、密碼,經過SSL協議的HTTPS,從而實現有效的身份驗證並訪問相應的WebApi。當然,訪問的方式不僅僅基於Http Basic一種,還可以通過令牌token的方式進行訪問,又或者基於redis實現單點登錄的訪問,本文主要講述的是基於Http Basic身份驗證,併在HTTPS安全的通信下,實現簡單集群身份驗證。

以下是本文講述的主要結構圖:

客戶端輸入用戶名密碼,訪問Nginx的URL:https://zhyongfeng.com/api/user/GetMachine,然後Nginx進行負載均衡,返回https的響應。Nginx集群之SSL證書的WebApi身份驗證架構,如下圖所示:

BASIC認證的缺點

HTTP基本認證的目標是提供簡單的用戶驗證功能,其認證過程簡單明瞭,適合於對安全性要求不高的系統或設備中,如大家所用路由器的配置頁面的認證,幾乎都採取了這種方式。其缺點是沒有靈活可靠的認證策略,如無法提供域(domain或realm)認證功能,另外,BASE64的加密強度非常低。當然,HTTP基本認證系統也可以與SSL或者Kerberos結合,實現安全性能較高(相對)的認證系統。

3       AuthorizeAttribute類

當你使用 AuthorizeAttribute 標記某個操作方法時,對該操作方法的訪問將限於已經過身份驗證且獲得授權的用戶。

如果使用該特性標記某個控制器,則該控制器中的所有操作方法均將受到限制。

Authorize 特性允許你指示將授許可權於預定義角色或個別用戶。 這使你可以對誰有權查看站點上的任何頁面進行嚴格控制。

如果未經授權的用戶嘗試訪問使用 Authorize 特性標記的方法,MVC 框架將返回 401 HTTP 狀態代碼。

如果站點配置為使用 ASP.NET 窗體身份驗證,則 401 狀態代碼會導致瀏覽器將用戶重定向到登錄頁。

從AuthorizeAttribute派生,如果要從 AuthorizeAttribute 類派生,則派生的類型必須是線程安全的。

因此,不要在類型實例本身中(例如,在實例欄位中)存儲狀態(除非該狀態要應用於所有請求), 而應在 Items 屬性中按請求存儲狀態,該屬性可通過傳遞給 AuthorizeAttribute 的上下文對象進行訪問。

具體特性可以訪問:

https://msdn.microsoft.com/zh-cn/library/system.web.mvc.authorizeattribute.aspx

4       Openssl生成SSL證書

請參照《Nginx集群之SSL證書的WebApi微服務》

http://www.cnblogs.com/yongfeng/p/7921905.html

5       編寫.NET WebApi

伺服器端:

CustomAuthorizeAttribute.cs

using System.Web.Http;
using System.Web.Http.Controllers;

namespace SSLWebApi.Controllers
{
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            //判斷用戶是否登錄
            if (actionContext.Request.Headers.Authorization != null)
            {
                string userInfo = System.Text.Encoding.Default.GetString(System.Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));
                //用戶驗證邏輯  
                if (string.Equals(userInfo, string.Format("{0}:{1}", "zhyongfeng", "123456")))
                {
                    IsAuthorized(actionContext);
                }
                else
                {
                    HandleUnauthorizedRequest(actionContext);
                }
            }
            else
            {
                HandleUnauthorizedRequest(actionContext);
            }
        }
        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
            throw new System.Web.Http.HttpResponseException(challengeMessage);
        }
    }
}

BaseController.cs

using System.Web.Http;

namespace SSLWebApi.Controllers
{
    /// <summary>
    /// BaseController繼承BaseController則需要身份驗證
    /// </summary>
    [CustomAuthorize]
    public class BaseController : ApiController
    {
    }
}

UserController.cs

using System.Net;
using System.Web.Http;

namespace SSLWebApi.Controllers
{
    [RoutePrefix("api/User")]
    public class UserController : BaseController
    {
        /// <summary>
        /// 獲取當前用戶信息
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostMessage")]
        public string PostMessage([FromBody]string msg)
        {
            return string.Format("當前輸入的消息是:{0}", msg);
        }

        [Route("GetMachine")]
        public string GetMachine()
        {
            string AddressIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP = _IPAddress.ToString();
                }
            }
            return string.Format("當前WebApi部署的IP是:{0}", AddressIP);
        }
    }
}

 

客戶端:

Program.cs

using System;
using System.IO;
using System.Net;
using System.Text;

namespace SSLWebApiClient
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                //https協議基本認證 Authorization
                string url = "https://zhyongfeng.com/api/user/GetMachine";
                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                NetworkCredential credential = new NetworkCredential("zhyongfeng", "123456");
                req.Credentials = credential;
                HttpWebResponse response = (HttpWebResponse)req.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
                string html = streamReader.ReadToEnd();
                Console.WriteLine(html);
            }
            Console.Read();
        }
    }
}

6       部署WebApi到區域網內3台PC機

將WebApi部署到以下10.92.202.56的3台PC機

7       Nginx集群配置搭建

通過自主義功能變數名稱zhyongfeng.com:80埠進行負載均衡集群訪問,則訪問C:\Windows\System32\drivers\etc\hosts,添加下列“本機IP 自定義的功能變數名稱”:

10.93.85.66     zhyongfeng.com

Nginx的集群配置:

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    #server {
    #    listen       80;
    #    server_name  localhost;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #    error_page   500 502 503 504  /50x.html;
    #    location = /50x.html {
    #        root   html;
    #    }
    #}

    upstream zhyongfeng.com {
        server    10.92.202.56:560;
        server    10.92.202.57:570; 
        server    10.92.202.58:580;
    }
    server {
        listen       80;
        server_name  zhyongfeng.com;
        rewrite ^(.*)$  https://$host$1 permanent;
    }
    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  zhyongfeng.com;
        ssl_certificate      server.crt;
        ssl_certificate_key  server_nopass.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
        location / {
            proxy_pass   http://zhyongfeng.com;
        }
    }
}

運行CMD:

D:\DTLDownLoads\nginx-1.10.2>start nginx

D:\DTLDownLoads\nginx-1.10.2>nginx -s reload

8       運行結果

直接訪問功能變數名稱運行結果:

SOAP UI調用運行結果:

啟動客戶端,通過身份驗證運行結果如下:

9       總結

在HTTP協議進行通信的過程中,HTTP協議定義了基本認證過程以允許HTTP伺服器對WEB瀏覽器進行用戶身份證的方法,當一個客戶端向HTTP服務 器進行數據請求時,如果客戶端未被認證,則HTTP伺服器將通過基本認證過程對客戶端的用戶名及密碼進行驗證,以決定用戶是否合法。客戶端在接收到HTTP伺服器的身份認證要求後,會提示用戶輸入用戶名及密碼,然後將用戶名及密碼以BASE64加密。

Nginx基於SSL協議下,利用http basic身份驗證,可以實現簡單訪問WebApi,達到集群負載均衡的效果。通過簡單的設計,在區域網上應用還是夠用的。當然,身份認證方式有很多種,使用redis、token都是可以的。WebApi基於SSL協議數據傳輸加密,結合http basic在一定上保證了通信的安全性。

 

源代碼下載:

http://download.csdn.net/download/ruby_matlab/10141134

 

PDF下載:

Nginx集群之SSL證書的WebApi身份驗證.pdf


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • data.xml 通過 linq to xml ,查找價格超過10的產品,並列印供應商名稱與產品名稱; 輸出 SupplierName=CD-by-CD-by-Sondheim , ProductName=AssassinsSupplierName=Solely Sondheim , Product ...
  • 瞭解一個語言最好的方式就是在編輯器中按照語法規則輸入代碼,然後運行並查看結果是否符合預期。本博文介紹S#編輯器軟體界面及其相關各模塊的主要功能,並通過通過帶有局部變數的S#代碼來表達和生成幾何圖形,從而說明瞭S#代碼的常用編寫流程。 ...
  • 瞭解一個語言最好的方式就是在編輯器中按照語法規則輸入代碼,然後運行並查看結果是否符合預期。本博文內容非常重要,承上啟下,不但公開了S#語言的所有武功招式——語法規則,並提供了練功的基礎工具——編輯器,統統都是乾貨呀。 ...
  • 在C#的字元串,其中有許多空格,現要求是把多餘的空格去除保留一個。原理是使用Split()方法進行分割,分割有一個選項是RemoveEmptyEntries,然後再把分割後的字元串Join起來。 string string1 = "AAaaA Oopps 32 211 44.8 69 15.9 C# ...
  • 最近學習數據驅動UI,瞭解到INotifyPropertyChanged這個介面的用法,看了很多網上的文章,自己作了一個總結。 INotifyPropertyChanged這個介面其實非常簡單,只有一個PropertyChanged事件,如果類繼承了這個介面,就必須實現介面。用VS的提示,就是補充了 ...
  • RoutData.values[Key] 只能獲取路由定義中的數據,url參數的數據不包含在裡面 https://i.cnblogs.com/EditPosts.aspx?opt=1 路由:功能變數名稱到?之間 -->EditPosts.aspx URL參數:?之後 -->opt=1 修改路由規則後 ...
  • 鏈接的地址,可以根據路由規則動態生成,不用寫死,文檔結構有變化時,依然可以找到正確的路徑 1.url.Action(只生成URL) 有很多重載方法,可以根據需要選擇,生成URL時,會根據路由規則生成,不過調用時也是根據路由規則定址,所以OK 2.Html.ActionLink(生成整個Link標簽) ...
  • 你有一個函數,其中完全取決於參數值而採取不同行為。針對該參數的每個可能值,建立一個獨立的函數。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...