IdentityServer4 中文文檔 -9- (快速入門)使用客戶端憑證保護API

来源:http://www.cnblogs.com/ideck/archive/2017/08/04/ids_quickstarts_9.html
-Advertisement-
Play Games

IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...


# IdentityServer4 中文文檔 -9- (快速入門)使用客戶端憑證保護API

原文:http://docs.identityserver.io/en/release/quickstarts/1_client_credentials.html

上一篇:IdentityServer4 中文文檔 -8- (快速入門)設置和概覽
下一篇:IdentityServer4 中文文檔 -10- (快速入門)使用密碼保護API

快速入門展示了使用 IdentityServer 保護 API 的最基礎的場景。

在這個場景中,我們定義一個 API,同時定義一個 想要訪問這個 API 的 客戶端。客戶端將從 IdentityServer 請求獲得一個訪問令牌,然後用這個令牌來獲得 API 的訪問許可權。

定義 API

範圍(Scopes)用來定義系統中你想要保護的資源,比如 API。

由於當前演練中我們使用的是記憶體配置 —— 添加一個 API,你需要做的只是創建一個 ApiResource 類型的實例,併為它設置合適的屬性。

向你的項目中添加一份文件(比如:Config.cs),然後添加如下代碼:

public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource("api1", "我的 API")
    };
}

定義 客戶端

下一步是定義能夠訪問上述 API 的客戶端。

在該場景中,客戶端不會有用戶參與交互,並且將使用 IdentityServer 中所謂的客戶端密碼(Client Secret)來認證。添加如下代碼到你的配置中:

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        new Client
        {
            ClientId = "client",

            // 沒有交互性用戶,使用 clientid/secret 實現認證。
            AllowedGrantTypes = GrantTypes.ClientCredentials,

            // 用於認證的密碼
            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },
            // 客戶端有權訪問的範圍(Scopes)
            AllowedScopes = { "api1" }
        }
    };
}

配置 IdentityServer

為了讓 IdentityServer 使用你的 Scopes 和 客戶端 定義,你需要向 ConfigureServices 方法中添加一些代碼。你可以使用便捷的擴展方法來實現 —— 它們在幕後會添加相關的存儲和數據到 DI 系統中:

public void ConfigureServices(IServiceCollection services)
{
    // 使用記憶體存儲,密鑰,客戶端和資源來配置身份伺服器。
    services.AddIdentityServer()
        .AddTemporarySigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients());
}

現在,如果你運行伺服器並將瀏覽器導航到 http://localhost:5000/.well-known/openid-configuration,你應該看能到所謂的 發現文檔。你的客戶端和 API 將使用這些信息來下載所需要的配置數據。

添加 API

下一步,向你的解決方案中添加 API。

你可以使用 ASP.NET Core Web API 模板,或者添加 Microsoft.AspNetCore.Mvc 程式包到你的項目中。再一次建議你像之前一樣,控制所使用的埠並使用與之前配置 Kestrel 和啟動資料相同的技術。該演練假設你已經將你的 API 配置為運行於 http://localhost:5001 之上。

控制器

添加一個新的控制器到你的 API 項目中:

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

這個控制器將在後面被用於測試授權需求,同時通過API的眼睛(瀏覽工具)來可視化身份信息。

配置

接下來,添加認證中間件到 API 宿主。該中間件的主要工作是:

  • 驗證輸入的令牌以確保它來自可信任的發佈者(IdentityServer);
  • 驗證令牌是否可用於該 api(也就是 Scope)。

IdentityServer4.AccessTokenValidation NuGet 程式包添加到你的 API 項目:

你還需要添加中間件到你的 HTTP 管道中 —— 必須在添加 MVC 之前添加,比如:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
     loggerFactory.AddConsole(Configuration.GetSection("Logging"));
     loggerFactory.AddDebug();

     app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
     {
         Authority = "http://localhost:5000",
         RequireHttpsMetadata = false,
         ApiName = "api1"
     });

     app.UseMvc();
 }

如果你使用瀏覽器導航到上述控制器(http://localhost:5001/identity),你應該收到返回的 401 狀態碼。這意味著你的 API 要求提供證書。

這樣一來, API 就是受 IdentityServer 保護的了。

創建客戶端

最後一個步驟是編寫一個客戶端來請求訪問令牌,然後使用這個令牌來訪問 API。為此你需要為你的解決方案添加一個控制台應用程式。

IdentityServer 上的令牌端點實現了 OAuth 2.0 協議,你應該使用合法的 HTTP 來訪問它。然而,我們有一個叫做 IdentityModel 的客戶端庫,它將協議交互封裝到了一個易於使用的 API 裡面。

添加 IdentityModel NuGet 程式包到你的客戶端項目中。

IdentityModel 包含了一個用於 發現端點 的客戶端庫。這樣一來你只需要知道 IdentityServer 的基礎地址 —— 實際的端點地址可以從元數據中讀取:

// 從元數據中發現埠
var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

接著你可以使用 TokenClient 類型來請求令牌。為了創建一個該類型的實例,你需要傳入令牌端點地址、客戶端id和密碼。

然後你可以使用 RequestClientCredentialsAsync 方法來為你的目標 API 請求一個令牌:

// 請求以獲得令牌
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}

Console.WriteLine(tokenResponse.Json);

註意:從控制臺中複製和粘貼訪問令牌到 jwt.io 以檢查令牌的合法性。

最後是調用 API。

為了發送訪問令牌到 API,你一般要使用 HTTP 授權 header。這可以通過 SetBearerToken 擴展方法來實現:

// 調用API
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);

var response = await client.GetAsync("http://localhost:5001/identity");
if (!response.IsSuccessStatusCode)
{
    Console.WriteLine(response.StatusCode);
}
else
{
    var content = await response.Content.ReadAsStringAsync();
    Console.WriteLine(JArray.Parse(content));
}

最終輸出看起來應該是這樣的:

註意:預設情況下訪問令牌將包含 scope 身份信息,生命周期(nbf 和 exp),客戶端 ID(client_id) 和 發行者名稱(iss)。

進一步實踐

當前演練目前主要關註的是成功的步驟:

  • 客戶端可以請求令牌
  • 客戶端可以使用令牌來訪問 API

你現在可以嘗試引發一些錯誤來學習系統的相關行為,比如:

  • 嘗試在 IdentityServer 未運行時(unavailable)連接它
  • 嘗試使用一個非法的客戶端id或密碼來請求令牌
  • 嘗試在請求令牌的過程中請求一個非法的 scope
  • 嘗試在 API 未運行時(unavailable)調用它
  • 不向 API 發送令牌
  • 配置 API 為需要不同於令牌中的 scope

上一篇:IdentityServer4 中文文檔 -8- (快速入門)設置和概覽
下一篇:IdentityServer4 中文文檔 -10- (快速入門)使用密碼保護API


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

-Advertisement-
Play Games
更多相關文章
  • 目錄 <!--[if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'> </span>TOC \o "1-3" \h \z \u < ...
  • Ubuntu16.04作為目前最新版本的ubuntu系統,相信很多人都想在自己的電腦上安裝一下,然而系統的安裝方法各式各樣,u盤法、grub引導法等等,這裡我將介紹在win7系統下用easyBCD軟體建立引導,然後安裝ubuntu的方法,這就不需要製作u盤啟動盤那麼麻煩,只需配置一些引導文件即可。 ...
  • 成功登錄進入CentOS系統之後,我們首先看到的桌面就是GNOME圖形界面,下麵來看一下相關的基本操作。 個性化設置 1,設置屏幕解析度 進入菜單 2,更換桌面背景 進入下麵菜單。 選擇一張背景圖片,然後點擊OK。 3,更改視窗打開方式 預設每次都打開一個新的視窗,這樣看起來比較凌亂,如下圖。 進入 ...
  • 自動獲取動態IP地址 設置靜態IP地址 ...
  • 1.只顯示當前目錄 找到位置: 將這兩個小寫的w換成大寫W,然後source ~/.bashrc即可 2.終端顏色美化 vim ~/.bashrc 然後下麵這行的註釋去掉,打開這個變數的開關,即可使用彩色的命令行提示符 關閉force_color_prompt的的效果如下圖: 而打開後的效果如下圖: ...
  • memcached Memcached多用於作為資料庫的前端cache使用,從而減少資料庫的負載。Memcached是一種記憶體緩存,用於存儲鍵值對。 工作流程: (1) 檢查客戶端請求的數據是否在Memcached中,如果在,把請求的數據返回給客戶端。 (2) 客戶端請求的數據不在Memcached ...
  • nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數. ngx_http_limit_conn_module:該模塊用於限制每個定義的密鑰的連接數,特別是單個IP​​地址的連接數.使用limit ...
  • 解決win7無法打開chm格式文件的問題。(一)、簡單方法(本人用的這個)1.打開chm2.win7提示安全問題3.chm無法顯示內容4.關閉chm5.右鍵點擊chm,點擊“解除鎖定”,ok 沒有“解除鎖定”,暈。。。請往下6.右鍵點擊chm,點擊“壓縮到*.rar”,壓縮chm7.雙擊生成的壓縮文 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...