Identity Server 4 從入門到落地(七)—— 控制檯客戶端

尋找無名的特質發表於2021-12-08

前面的部分:
Identity Server 4 從入門到落地(一)—— 從IdentityServer4.Admin開始
Identity Server 4 從入門到落地(二)—— 理解授權碼模式
Identity Server 4 從入門到落地(三)—— 建立Web客戶端
Identity Server 4 從入門到落地(四)—— 建立Web Api
Identity Server 4 從入門到落地(五)—— 使用Ajax 訪問 Web Api
Identity Server 4 從入門到落地(六)—— 簡單的單頁面客戶端

認證服務和管理的github地址: https://github.com/zhenl/IDS4Admin
客戶端及web api示例程式碼的github地址:https://github.com/zhenl/IDS4ClientDemo

前面我們試驗的客戶端都是有終端使用者參與的,也就是需要使用者登入進行認證。如果專案中存在後臺服務訪問Web Api,這種情況下沒有使用者參與認證過程,就需要使用Client Credentials flow。我們建立一個簡單的控制檯專案試驗一下。

首先在認證服務的管理應用中建立一個新的客戶端,選擇使用Client Credentials flow:
Identity Server 4 從入門到落地(七)—— 控制檯客戶端

然後設定作用域和客戶端金鑰,這裡作用域中新增myapi,訪問我們的測試Api:
Identity Server 4 從入門到落地(七)—— 控制檯客戶端

在我們前面的測試解決方案中增加一個新的.Net 6控制檯專案,名稱為IDSClientConsole,建立完成後,引入程式包IdentityModel:

修改Program.cs如下:

using IdentityModel.Client;
using Newtonsoft.Json.Linq;

await GetTokenAndCallApiAsync();

static async Task GetTokenAndCallApiAsync()
{
    // discover endpoints from metadata
    var client = new HttpClient();
    var disco = await client.GetDiscoveryDocumentAsync("http://localhost:4010");
    if (disco.IsError)
    {
        Console.WriteLine(disco.Error);
        return;
    }

    var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
    {
        Address = disco.TokenEndpoint,

        ClientId = "consoleclient",
        ClientSecret = "secret1",
        Scope = "myapi"
    });

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

    Console.WriteLine(tokenResponse.Json);

    // call api
    var apiClient = new HttpClient();
    apiClient.SetBearerToken(tokenResponse.AccessToken);

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

設定解決方案的啟動專案,將這個控臺專案和Web Api設定為同時啟動:

專案啟動後,控制檯應用通過認證,然後訪問Web Api獲取資料,結果如下:

到這裡,我們已經試驗了在Web應用、單頁面應用和客戶端應用中訪問認證服務進行認證,還測試了認證服務對Web Api的保護,接下來準備落地,為在專案中實際使用做準備,還有如下問題需要解決:

  • 基於.Net Framework的遺留專案如何使用認證服務。
  • 現有的使用Asp.Net Core使用Identity的專案如何改造。
  • 簡化客戶端和Web Api的程式設計,將程式碼中寫死的配置項移動到配置檔案。
  • 認證服務和管理應用的多種部署方式:部署到IIS,部署到Docker容器等等。

接下來的部分我們將一一解決這些問題。

相關文章