Asp.NetCoreWebApi圖片上傳介面(二)集成IdentityServer4授權訪問(附源碼)

来源:https://www.cnblogs.com/yilezhu/archive/2018/07/16/9315644.html
-Advertisement-
Play Games

寫在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇關於Asp.Net Core Web Api圖片上傳的文章使用的是mongoDB進行圖片的存儲,文章發佈後,張隊就來了一句,說沒有使用GridFS。的確博主只是 ...


寫在前面

本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html
作者:yilezhu
上一篇關於Asp.Net Core Web Api圖片上傳的文章使用的是mongoDB進行圖片的存儲,文章發佈後,張隊就來了一句,說沒有使用GridFS。的確博主只是進行了簡單的圖片上傳以及mongoDB存儲操作,目的是提供思路。具體的圖片存儲,有條件的還是基於阿裡雲OSS或者七牛吧,如果實在想用MongDB進行存儲的話,建議採用GridFS的方式!
又有人說,GridFS大於16M的時候才適合使用,圖片上傳已經控制小於1M了,就沒必要使用GridFS了吧。這裡可以指定chunksize的大小。這樣性能上就沒有什麼問題了。而且在性能差不多的時候使用GridFS可以更方便的管理。因此建議如果採用MongDB進行文件存儲的話,建議採用GridFS的方式。 這裡特別感謝張隊的耐心指導!

為什麼使用IdentityServer4?

上一篇文章中,給大家講解瞭如何通過 Asp.Net Core Web Api實現圖片上傳的介面,具體的可以[點這裡查看][https://www.cnblogs.com/yilezhu/p/9297009.html] 。這個介面是一個公開的介面,如何發佈的話,任何知道調用方法的"任何人"都能任意的調用這個介面,俗稱“裸奔”。這時候我們就應該給介面加入認證以及訪問控制機制,來加強安全性!那麼我們怎麼來實現介面的認證以及訪問控制呢?這時候部分人就會很懵逼了,還有一部分人就會聯想到 OpenID Connect 和 OAuth 2.0了!可是怎麼實現呢?從到到位搭一個這樣的框架,會累死我滴,可能還要經過很長時間的測試呢!別擔心,這時候就體現出Asp.Net Core社區的強大了,我們的主角IdentityServer4閃亮登場!

IdentityServer4是什麼?能幫我們做什麼呢?

IdentityServer4是一套為 ASP.NET Core 2.0開發的基於OpenID Connect 和 OAuth 2.0 的框架,他能讓我們的系統很輕鬆的就能很多認證以及授權相關的功能,比如:單點登錄,api訪問控制等等!其他的我就不介紹了,社區裡面介紹的太多太多了!如果有想瞭解的OAuth 2.0的可以看看阮一峰的這篇文章[理解OAuth 2.0][http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html] 。最後 IdentityServer4最最最大好處是開源的,用的人也多,而且比較成熟。想想是不是有點小激動,迫不及待的想試試了。在開始之前,附上[開原地址][https://github.com/IdentityServer/IdentityServer4] 以及[詳細文檔][https://identityserver4.readthedocs.io/en/release/] 。想瞭解更多自行閱讀官方文檔吧!

為了演示的方便,本文采用的是客戶端認證模式,至於其他的幾種驗證模式,大家可以看下上面給出的阮一峰的文章。還有大家用之前要理解下身份認證伺服器(IdentityServer),用戶(User),客戶端(Client),資源(Resources),身份令牌(Identity Token),訪問令牌(Access Token)這些概念。如果不清楚的話可以參考曉晨Master的這篇“ASP.NET Core的身份認證框架IdentityServer4(3)-術語的解釋”文章。

Asp.Net Core Web Api中如何使用IdentityServer4呢?

創建IdentityServer4服務端即“身份認證伺服器(IdentityServer)”

  1. 新建一個空的Asp.Net Core Web Api項目,名稱為IdentityServer埠為5001,如下圖所示

    IdentityServer

  2. 通過Nuget安裝IdentityServer4命令如下,記得程式包管理控制套,上面的項目選擇剛剛創建的IdentityServer項目

    Install-Package IdentityServer4 

安裝IdentityServer4

  1. 這裡因為採用OAuth 2.0的客戶端模式,所以簡單地使用一個類來硬編碼一些資源(Resources)

以及客戶端(Client),代碼如下:

/// <summary>
    /// yilezhu
    /// 2018.7.15
    /// 因為此處採用in-memory,所以硬編碼一些api,以及client
    /// </summary>
    public class ApiConfig
    {
        /// <summary>
        /// 定義ApiResource   這裡的資源(Resources)指的就是我們的API
        /// </summary>
        /// <returns>ApiResource枚舉</returns>
        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new[]
            {
                new ApiResource("PictureApi", "圖片上傳的APi")
            };
        }

        /// <summary>
        /// 定義受信任的客戶端 Client
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Client> GetClients()
        {
            return new[]
            {
                new Client
                {
                    ClientId = "MobileUploadPicture",//客戶端的標識,要是惟一的
                    ClientSecrets = new [] { new Secret("yilezhu123".Sha256()) },//客戶端密碼,進行了加密
                    AllowedGrantTypes = GrantTypes.ClientCredentials,//授權方式,這裡採用的是客戶端認證模式,只要ClientId,以及ClientSecrets正確即可訪問對應的AllowedScopes裡面的api資源
                    AllowedScopes = new [] { "PictureApi" }//定義這個客戶端可以訪問的APi資源數組,上面只有一個api
                }
            };
        }
    }
  1. 在Startup.cs中註入IdentityServer服務並使用中間件,代碼如下:

     // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                //註入IdentityServer服務
                services.AddIdentityServer()
                    .AddDeveloperSigningCredential()
                    .AddInMemoryClients(ApiConfig.GetClients())
                    .AddInMemoryApiResources(ApiConfig.GetApiResources());
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                //添加認證中間件
                app.UseIdentityServer();
                app.UseMvc();
            }
  2. 用Postman測試並獲取AccessToken吧!如下圖所示,在Post請求中傳入,認證類型,client_id以及client_secret即可獲取AccessToken:

成功獲取Access_Token

當傳入錯誤的Client_id或者密碼將出現下麵的結果

錯誤的密碼,獲取不到

  1. 至此IdentityServer服務已經簡單地完成了!下麵改造下我們的圖片上傳服務。

改造圖片上傳介面,加入授權認證

  1. 在圖片上傳api項目中添加IdentityServer nuget包,這裡只需要加入AccessTokenValidation包即可,註意選擇api項目:

    Install-Package IdentityServer4.AccessTokenValidation

    安裝AccessTokenValidation

  2. appsettings.json中加入IdentityServerOptions,進行IdentityServer的一些配置

"IdentityServerOptions": {

    "ServerIP": "localhost",
    "ServerPort": 5001,
    "IdentityScheme": "Bearer",
    "ResourceName": "PictureApi"
  }
  1. 新建一個類用來匹配這個options,這樣可以爽爽的使用:

     /// <summary>
        /// yilezhu
        /// 2018.7.15
        /// IdentityServer的配置選項
        /// </summary>
        public class IdentityServerOptions
        {
            /// <summary>
            /// 授權伺服器的Ip地址
            /// </summary>
            public string ServerIP { get; set; }
            /// <summary>
            /// 授權伺服器的埠號
            /// </summary>
            public int ServerPort { get; set; }
            /// <summary>
            /// access_token的類型,獲取access_token的時候返回參數中的token_type一致
            /// </summary>
            public string IdentityScheme { get; set; }
            /// <summary>
            /// 資源名稱,認證服務註冊的資源列表名稱一致,
            /// </summary>
            public string ResourceName { get; set; }
        }
  2. 在Startup.cs中加入identityServer驗證

 // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //註入Options
            OptionsConfigure(services);
            var identityServerOptions = new IdentityServerOptions();
            Configuration.Bind("IdentityServerOptions", identityServerOptions);
            services.AddAuthentication(identityServerOptions.IdentityScheme)
                .AddIdentityServerAuthentication(options =>
                    {
                        options.RequireHttpsMetadata = false; //是否啟用https
                        options.Authority = $"http://{identityServerOptions.ServerIP}:{identityServerOptions.ServerPort}";//配置授權認證的地址
                        options.ApiName = identityServerOptions.ResourceName; //資源名稱,跟認證服務中註冊的資源列表名稱中的apiResource一致
                    }
                );

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthentication();

            app.UseMvc();
        }

        /// <summary>
        /// yilezhu
        /// 2018.7.10
        /// 註冊Options
        /// </summary>
        /// <param name="services">服務容器</param>
        private void OptionsConfigure(IServiceCollection services)
        {
            //MongodbHost信息
            services.Configure<MongodbHostOptions>(Configuration.GetSection("MongodbHost"));
            //圖片選項
            services.Configure<PictureOptions>(Configuration.GetSection("PictureOptions"));

        }
  1. 為需要說全訪問的圖片上傳介面添加[Authorize]特性,當然要引用下命名空間:

    using Microsoft.AspNetCore.Authorization;
     /// <summary>
            /// 介面上傳圖片方法
            /// </summary>
            /// <param name="fileDtos">文件傳輸對象,傳過來的json數據</param>
            /// <returns>上傳結果</returns>
            [HttpPost]
            [Authorize]
            public async Task<UploadResult> Post([FromBody] FileDtos fileDtos)
            {
                …………
            }
    
  2. 把授權服務以及圖片上傳介面同時啟動下,然後Postman再次進行下圖片上傳的測試:

    多項目啟動

    返回結果,未授權

  3. 在請求頭上加入我們獲取的token信息,來再次訪問下:

    加入驗證頭

    訪問成功

  4. Asp.Net Core Web Api圖片上傳介面集成Identity Server 4安全認證實例教程到此結束了。

示例代碼

[點我下載][https://github.com/yilezhu/ImageUploadApiDemo]

總結

本文通過圖片上傳這個Asp.Net Core Web Api做引子,然後引入Identity Server 4。然後通過一個簡單地實例教程闡述瞭如何創建Identity Server 以及介面中如何進行授權認證訪問。博主儘量採用通俗易懂的語言進行闡述,步驟也儘量詳細,目的就是為了讓初學者也能按照步驟一步一步的實現Identity Server 4的認證。下一篇我會加入SwaggerUI生成介面文檔,當然大家也可以看下我的這篇關於SwaggerUI的文章[ASP.NET Core WebApi使用Swagger生成api說明文檔看這篇就夠了][https://www.cnblogs.com/yilezhu/p/9241261.html] 。這個系列的教程源碼,我已經放在github上了,大家可以點這裡進行訪問源代碼。https://github.com/yilezhu/ImageUploadApiDemo


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

-Advertisement-
Play Games
更多相關文章
  • 更新時間:2018 06 14 《Python指南》原文在 "這裡" 。本篇筆記主要是劃重點。 Python 3.6.3 1、簡單入門 1.1 編碼 預設情況下,Python 源文件是 UTF 8 編碼。 你也可以為源文件指定不同的字元編碼。 1.2 註釋 Python 中的註釋以 字元起始,直至實 ...
  • 生成器的特點是工作到一半,就會停下來看別人幹活直至有人踢它屁股,這時它才繼續往下幹活。實現這一功能的精髓要用到yield。 生成器是一種特殊的迭代器,因此我們先來瞭解一下什麼是迭代器。我們都知道著名的斐波那契數列:1、1、2、3、5、8、13、21、34……從第三個數開始,每個數都可以由其前面的兩個 ...
  • 今日內容: 1、子評論評論樓的實現;評論樹尚未實現; 2、富文本編輯器的使用。 XSS攻擊全稱跨站腳本攻擊,為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的電腦安全漏洞,它允許惡意web用戶將代碼植入 ...
  • 上一篇文章,學習了併發編程中的volatile,最後取了網上流傳很廣的一張圖來結尾,從圖中可以看出除了volatile變數的讀寫,還有一個叫做CAS的東西,所以這篇文章再來學習CAS。 1、 併發編程三要素-原子性、可見性、有序性 在討論CAS前,我想先討論一下併發編程的三要素,這個應該可以幫助理解 ...
  • 什麼是RESTful? RESTful是一種開發理念,REST是Roy Thomas Fileding在他博文提出的.REST特點;url簡潔,將參數通過url傳遞到伺服器,簡單就是說URL定位資源,用HTTP動詞描述操作. RESTful架構: 每一個URL代表一種資源; 客戶端和伺服器之間,傳遞 ...
  • JRE(Java Runtime Environment Java運行環境) 包括Java虛擬機(JVM Java Virtual Machine)和Java程式所需的核心類庫等,如果想要運行一個開發好的Java程式,電腦中只需要安裝JRE即可。 JDK(Java Development Kit ...
  • 上兩篇文章我向大家介紹了一些線程間的基本通信方式,那麼這篇文章就和大家聊聊volatile關鍵字的相關知識。這個關鍵字在我們的日常開發中很少會使用到,而在JDK的Lock包和Concurrent包下的類則大量的使用了這個關鍵字,因為它有如下兩個特性: 1.確保記憶體可見性 2.禁止指令重排序 接下來就 ...
  • 2.矩陣專欄¶ 吐槽一下:矩陣本身不難,但是矩陣的寫作太蛋疼了 (⊙﹏⊙)汗 還好有Numpy,不然真的崩潰了... LaTex有沒有一個集成了很多常用公式以及推導或者含題庫的線上編輯器? 代碼褲子:https://github.com/lotapp/BaseCode 線上編程系:https://m ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...