.Net Core 3.0 IdentityServer4 快速入門

来源:https://www.cnblogs.com/haoxiaozhang/archive/2019/10/24/11727637.html
-Advertisement-
Play Games

.Net Core 3.0 IdentityServer4 快速入門 一、簡介 IdentityServer4是用於ASP.NET Core的OpenID Connect和OAuth 2.0框架。 將IdentityServer4部署到您的應用中具備如下特點: 1)、認證服務 2)、單點登陸 3)、 ...


.Net Core 3.0 IdentityServer4 快速入門

一、簡介

  IdentityServer4是用於ASP.NET Core的OpenID Connect和OAuth 2.0框架。

  將IdentityServer4部署到您的應用中具備如下特點:

  1)、認證服務

  2)、單點登陸

  3)、API訪問控制

  4)、聯合網關

  5)、專註於定製

  6)、成熟的開源系統

  7)、免費和商業支持

二、整體部署

 

  目前大多數的應用程式或多或少看起來是上圖所示這樣的,最常見的交互場景有(瀏覽器與Web應用程式、Web應用程式與WebApi通訊、本地應用程式獄WebApi通訊、基於瀏覽器的應用程式與WebApi 通訊、基本伺服器的應用程式與WebApi通訊、WebApi與WebApi通訊)

  前端、中間層、後端各個層級為了保護資源經常要針對相同的用戶倉儲區實現身份認證和授權,但是如果我們把這些基本的安全功能統一頒發給一個安全令牌服務,就可以不必再讓這些應用和端點之間重覆實現這些基礎安全功能,重組應用程式以支持安全令牌服務將會引導出以下體繫結構和協議

 

  這樣的設計將會把安全問題分為兩個部分:(身份驗證和API訪問)

三、IdentityServer4如何提供幫助

  IdentityServer是將規範相容的OpenID Connect和OAuth 2.0端點添加到任意ASP.NET Core應用程式的中間件。通常,您構建(或重新使用)包含登錄和註銷頁面的應用程式,IdentityServer中間件會向其添加必要的協議頭,以便客戶端應用程式可以與其對話 使用這些標準協議。

 

四、術語

 

     1)、Users(用戶):用戶是使用已註冊的客戶端訪問資源的人

     2)、Clients(客戶端):客戶端就是從identityserver請求令牌的軟體(你可以理解為一個app即可),既可以通過身份認證令牌來驗證識別用戶身份,又可以通過授權令牌來訪問服務端的資源。但是客戶端首先必須在申請令牌前已經在identityserver服務中註冊過。實際客戶端不僅可以是Web應用程式,app或桌面應用程式(你就理解為pc端的軟體即可),SPA,伺服器進程等

  3)、Resources(資源):

  資源就是你想用identityserver保護的東東,可以是用戶的身份數據或者api資源。
  每一個資源都有一個唯一的名稱,客戶端使用這個唯一的名稱來確定想訪問哪一個資源(在訪問之前,實際identityserver服務端已經配置好了哪個客戶端可以訪問哪個資源,所以你不必理解為客戶端只要指定名稱他們就可以隨便訪問任何一個資源)。

  用戶的身份信息實際由一組claim組成,例如姓名或者郵件都會包含在身份信息中(將來通過identityserver校驗後都會返回給被調用的客戶端)。

  API資源就是客戶端想要調用的功能(通常以json或xml的格式返回給客戶端,例如webapi,wcf,webservice),通常通過webapi來建立模型,但是不一定是webapi,我剛纔已經強調可以使其他類型的格式,這個要看具體的使用場景了。

  4)、Identity Token(身份令牌):

  一個身份令牌指的就是對認證過程的描述。它至少要標識某個用戶(Called the sub aka subject claim)的主身份信息,和該用戶的認證時間和認證方式。但是身份令牌可以包含額外的身份數據,具體開發者可以自行設定,但是一般情況為了確保數據傳輸的效率,開發者一般不做過多額外的設置,大家也可以根據使用場景自行決定。

  5)、Access Token(訪問令牌):

   訪問令牌允許客戶端訪問某個 API 資源。客戶端請求到訪問令牌,然後使用這個令牌來訪問 API資源。訪問令牌包含了客戶端和用戶(如果有的話,這取決於業務是否需要,但通常不必要)的相關信息,API通過這些令牌信息來授予客戶端的數據訪問許可權。

五、代碼快速入門 (使用客戶端憑據保護)

  1)、IdentityServer

     a)、定義Api資源和客戶端

      Api 是您系統中要保護的資源,資源的定義可以通過多種方式

      客戶端代碼中的ClientId和ClientSecret你可以視為應用程式本身的登錄名和密碼,它將您的應用程式標識到IdentityServer 伺服器,以便它知道哪個應用程式正在嘗試與其連接

using IdentityServer4.Models;
using System.Collections.Generic;

namespace IdentityServer
{
    public static class Config
    {
        public static IEnumerable<ApiResource> Apis
            => new List<ApiResource>
        {
            new ApiResource("api1","My API")
        };

        public static IEnumerable<Client> Clients =>
            new List<Client>
            {
                new Client
                {
                    ClientId="client",
                    AllowedGrantTypes =GrantTypes.ClientCredentials,
                    ClientSecrets={
                    new Secret("aju".Sha256())
                    },
                    AllowedScopes={ "api1"}
                }
            };
    }
}
View Code

    b)、配置IdentityServer

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace IdentityServer
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            var builder = services.AddIdentityServer()
                .AddInMemoryApiResources(Config.Apis)
                .AddInMemoryClients(Config.Clients);
            builder.AddDeveloperSigningCredential();
        }

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

            app.UseIdentityServer();

            //app.UseRouting();

            //app.UseEndpoints(endpoints =>
            //{
            //    endpoints.MapGet("/", async context =>
            //    {
            //        await context.Response.WriteAsync("Hello World!");
            //    });
            //});
        }
    }
}
View Code

    c)、測試(如果配置合適,在瀏覽器訪問 http://localhost:5000/.well-known/openid-configuration  出現如下表示配置OK)

  首次啟動時,IdentityServer將為您創建一個開發人員簽名密鑰,該文件名為tempkey.rsa您無需將該文件簽入源代碼管理中,如果不存在該文件將被重新創建。

    d)、所需的包

  2)、添加Api資源

  a)、添加一個名為IdentityController的控制器

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;

namespace Api.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        public IActionResult Get()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}
View Code

  b)、配置(將身份認證服務添加到DI,並將身份驗證中間件添加到管道)    

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;
                options.Audience = "api1";
            });
        }

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

            app.UseRouting();

            app.UseAuthentication();//認證
            app.UseAuthorization();//授權


            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
View Code

   AddAuthentication:將身份認證服務添加到DI比配置Bearer為預設

   AddAuthentication:將身份認證服務添加到管道中,以便對主機的每次調用都將自動執行身份驗證

   AddAuthentication:添加授權中間件,以確保匿名客戶端無法訪問我們的API資源

   http://localhost:5001/identity 在瀏覽器上訪問應返回401狀態代碼。這意味著您的API需要憑據,並且現在受IdentityServer保護。

  c)、所需的包

 3)、創建客戶端(已控制台的形式)

using IdentityModel.Client;
using Newtonsoft.Json.Linq;
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace Client
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Console.WriteLine("Hello World!");
            var client = new HttpClient();
            var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");
            if (disco.IsError)
            {
                Console.WriteLine(disco.Error);
                return;
            }
            var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
            {
                Address = disco.TokenEndpoint,
                ClientId = "client",
                ClientSecret = "aju",
                Scope = "api1"
            });
            if (tokenResponse.IsError)
            {
                Console.WriteLine(tokenResponse.Error);
                return;
            }
            Console.WriteLine(tokenResponse.Json);
            Console.WriteLine("\n\n");
            //call api

            var apiClient = new HttpClient();
            apiClient.SetBearerToken(tokenResponse.AccessToken);
            var response = await apiClient.GetAsync("http://localhost:5001/identity");
            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine(response.StatusCode);
            }
            else
            {
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(JArray.Parse(content));
            }
            Console.ReadLine();
        }
    }
}
View Code

  a)、所需的包

  

 4)、使用客戶端訪問Api資源

  

 

六、參考文獻

  http://docs.identityserver.io/en/latest/index.html

 如果對您有幫助,請點個推薦(讓更多需要的人看到哦)


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

-Advertisement-
Play Games
更多相關文章
  • PDF是當今最流行的文檔格式之一,各種應用程式將其用作最終輸出。由於支持多種數據類型和可移植性,因此它是創建和共用內容的首選格式。作為對開發文檔管理應用程式感興趣的.NET應用程式開發人員,可能希望嵌入處理功能,以讀取PDF文檔並將其轉換為其他文件格式,例如HTML。 下麵,來探索並演示一下Aspo ...
  • CefSharp編譯後,在直接點擊打開CefSharp.Wpf.Example.exe,啟動沒問題但是複製demo包到其它路徑下,無法打開demo。原因:代碼中含有相對路徑下的資源文件引用。 CefSharp.Example中文件BrowserProcessHandler.cs CefSharp.E ...
  • 背景: 因編程的基礎差,因此最近開始鞏固學習C#基礎,後期把自己學習的東西,總結相應文章中,有不足處請大家多多指教。 1. 簡介 運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。C# 有豐富的內置運算符,分類如下: 算術運算符 關係運算符 邏輯運算符 複合賦值運算符 位運算符 其他運算符 本文 ...
  • 在CefSharp75版本,使用了WpfImeKeyboardHandler支持後,無法支持搜狗中文輸入法 其中的一個修複方案: 在ChrominumWebBrowser中,添加焦點事件的重寫,對InputMethod相關進行修改 SetIsInputMethodEnabled -- 是否可輸入中文 ...
  • /// <summary> /// 生成文件的 /// </summary> /// <param name="calssName"></param> public void create(string calssName) { //獲取程式集 var createClass = Assembly. ...
  • 1.關係 關係定義兩個實體之間的關係。在關係型資料庫中,這由外鍵約束表示。 2.術語定義 有許多術語用於描述關係:●相關實體:這是包含外鍵屬性的實體。有時稱為關係的"子級"。●主體實體:這是包含主/備用鍵屬性的實體。有時稱為關係的 "父項"。●外鍵:依賴實體中的屬性,用於存儲與實體相關的主體鍵屬性的 ...
  • 安裝WSL 1、打開WINDOWS功能,勾選子系統選項 2、打開商店搜索WSL,安裝ubuntu 我這裡的系統版本是:18.04 如何查看ubuntu系統版本 sudo lsb_release a 或 cat /etc/issue 3、打開ubuntu,設置賬號密碼 安裝.net core SDK ...
  • 因為nuget線上下載有時候很慢,所以下載nuget包,進行本地安裝 登陸nuget官網https://www.nuget.org/下載相關資源 選擇對應版本進行下載,同時需要下載相關依賴的包 ​ 最終下載的共4個包,cef.redist64,cef.redist86,cefsharp.common ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...