asp.net core IdentityServer4 實現 resource owner password credentials(密碼憑證)

来源:https://www.cnblogs.com/yyfh/archive/2019/09/28/11601903.html
-Advertisement-
Play Games

前言 OAuth 2.0預設四種授權模式(GrantType) 授權碼模式(authorization_code) 簡化模式(implicit) "密碼模式( resource owner password credentials )" "客戶端模式(client_credentials)" 本章主 ...


前言

OAuth 2.0預設四種授權模式(GrantType)

本章主要介紹密碼模式(resource owner password credentials),OAuth2.0資源所有者密碼授權功能允許客戶端將用戶名和密碼發送到令牌服務,並獲得該用戶的訪問令牌.

認證步驟:

  • 用戶將用戶名密碼提供給客戶端
  • 客戶端再將用戶名密碼發送給授權伺服器,請求令牌
  • 授權伺服器確定判斷信息是否有誤,返回給客戶端令牌

創建授權伺服器

創建一個API項目工程,我這邊以埠5000的形式進行後面的講解.

Package

PM> Install-package IdentityServer4 -version 2.5.3

創建一個類Config(配置要保護的資源,和可以訪問的API的客戶端伺服器)

   public class Config
    {
        /// <summary>
        ///     定義要保護的資源
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<ApiResource> GetApiResources() {
            return new List<ApiResource>
            {
               new ApiResource("api1","MyApi")
            };
        }
        /// <summary>
        ///     定義授權客戶端
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Client> GetClients() {
            return new List<Client>
            {
                new Client(){ 
                    ClientId="client",
                    AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,
                    ClientSecrets=
                    {
                      new Secret("secret".Sha256())
                    },
                    AllowedScopes={ "api1",IdentityServerConstants.StandardScopes.OfflineAccess //如果要獲取refresh_tokens ,必須在scopes中加上OfflineAccess
                    },
                    AllowOfflineAccess=true// 主要刷新refresh_token,
        
                }
            };
        }
    }

此處AllowedGrantTypes需要設置為ResourceOwnerPassword(密碼憑證).

配置Startup

再走到ConfigureServices方法註入IdentityServer4服務

   public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryApiResources(Config.GetApiResources())
                .AddInMemoryClients(Config.GetClients())
                .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>();//註入自定義登錄驗證

        }

IdentityServer4預設提供了兩種證書加密配置
AddDeveloperSigningCredential AddTemporarySigningCredential
添加記憶體ApiResourceAddInMemoryApiResources
添加記憶體Client AddInMemoryClients
添加自定義登錄驗證AddResourceOwnerValidator

自定義用戶驗證
    public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
    {
        public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
        {
            if (context.UserName == "test" && context.Password == "test")
            {
                context.Result = new GrantValidationResult(
                 subject: context.UserName,
                 authenticationMethod: OidcConstants.AuthenticationMethods.Password);
            }
            else
            {
                //驗證失敗
                context.Result = new GrantValidationResult(
                    TokenRequestErrors.InvalidGrant,
                    "invalid custom credential"
                    );
            }
            return Task.FromResult(0);
        }
    }

在Configure方法中添加IdentityServer4服務中間件

app.UseIdentityServer();

創建ApiResource

創建一個客戶端項目,這邊我將埠設置為5001

Package

PM> Install-package IdentityServer4 -version 2.5.3

配置Startup

在ConfigureServices添加認證伺服器地址

      public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddAuthentication("Bearer")
              .AddIdentityServerAuthentication(options =>
              {
                  options.Authority = "http://localhost:5000";//授權伺服器地址
                   options.RequireHttpsMetadata = false;//不需要https    
                   options.ApiName = "api1";
              });
        }

在Configure方法中添加認證服務中間件

app.UseAuthentication();

Run

在客戶端程式values控制器上面增加[Authorize]

直接訪問資源伺服器http://localhost:5001/api/values

code 401

啟動授權伺服器

http://localhost:5000/.well-known/openid-configuration

發現端點可通過/.well-known/openid-configuration

獲取token

這邊我用postman進行測試

code 200

access_token我們獲取到了,再拿著token通過postman請求資源程式,

code 200
成功了

refresh_token

獲取請求授權介面後會返回access_token expires
_in 等內容,expires_in是有效期(s),當然我們可以自定義有效期,access_token失效後用戶需要重新授權,client才能拿到新的access_token.但是有了refresh_token後,client檢測到token失效後可以直接通過refresh_token向授權伺服器申請新的token,當然refresh_token也是有有效期的。
AbsoluteRefreshTokenLifetime的預設有效期為2592000秒/30天。SlidingRefreshTokenLifetime的預設有效期為1296000秒/15天。

在認證伺服器中我再scopes加上了OfflineAccess
IdentityServerConstants.StandardScopes.OfflineAccess //如果要獲取refresh_tokens ,必須在scopes中加上OfflineAccess

獲取refresh_token

通過refresh_token再去獲取access_token

通過postman請求獲取資源

概要

示例地址https://github.com/fhcodegit/IdentityServer4.Samples


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

-Advertisement-
Play Games
更多相關文章
  • 知識點 1. 初始化 :每一個flask程式都必須創建一個程式實例,遵循WSGI(Web Server Gateway interface)協議,把請求 flask Obj; 創建實例: Flask 類的構造函數只有一個必須指定的參數,即程式主模塊或包的名字。在大多數程式中,Python 的 __n ...
  • Flask框架整個流程源碼解讀 一.總的流程 運行Flask其本質是運行Flask對象中的\_\_call\_\_,而 本質調用wsgi_app的方法 二.具體流程 1.ctx = self.request_context(environ) environ 請求相關的,ctx現在是包含request ...
  • 最近在開發一個輕量級ASP.NET MVC開發框架,需要加入日誌記錄,郵件發送,簡訊發送等功能,為了保持模塊的獨立性,所以需要通過消息通信的方式進行處理,為了保持框架在部署,使用,二次開發過程中的簡易便捷性,所以沒有選擇傳統的MQ,而是基於Redis的訂閱發佈實現一個系統內部消息組件,話不多說,上碼 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 參考地址,官網:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-2.2&tabs=visual-studio 與https://www.ji ...
  • 背景 目前我主要負責的一個項目是一個 C/S 架構的客戶端開發,前端主要是通過 相關技術來實現,後端是通過 來實現,前後端的數據通信則是通過 的方式來進行處理。由於 進程是需要依賴客戶端進程來運行,為了保證後端業務進程的穩定性,就需要通過一個 來守護 Python 進程,防止其由於未知原因而出現進程 ...
  • 最近做一個基於ABP的.net Core的項目,資料庫選了MongoDB,但是返現無法給資料庫設置認證,只要設置了賬號密碼連接就報錯 連接串如下: mongodb://root:[email protected]/Webdev 已經給了root用戶"__system"角色,使用Ro ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...