.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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...