ASP.NET Core3.1使用IdentityServer4中間件系列隨筆(三):建立使用[客戶端憑證]受權模式的客戶端

上一篇《ASP.NET Core3.1使用IdentityServer4中間件系列隨筆(二):建立API項目,配置IdentityServer保護API資源》建立了受保護的API資源項目html

並經過Postman獲取到了access_token,再使用access_token去訪問受保護的API資源,本篇將建立一個使用[客戶端憑證]受權模式的客戶端,來對受保護的API資源進行訪問。api

先了解一下客戶端憑證模式服務器

Client Credentials:客戶端憑證模式;該方法一般用於服務器之間的通信;該模式僅發生在Client與Identity Server之間。
該模式的適用場景爲服務器與服務器之間的通訊。
好比對於一個電子商務網站,將訂單和物流系統分拆爲兩個服務分別部署。
訂單系統須要訪問物流系統進行物流信息的跟蹤,物流系統須要訪問訂單系統的快遞單號信息進行物流信息的定時刷新。
而這兩個系統之間服務的受權就能夠經過這種模式來實現。app

一、建立一個名爲 ClientCredentialsConsoleApp 控制檯應用。async

 

 

 

 

 

 二、添加nuget包:IdentityModelpost

 

 

 三、在Program.cs類中編寫代碼網站

using System;
using System.Net.Http;
using System.Threading.Tasks;

using IdentityModel.Client;

using Newtonsoft.Json.Linq;

namespace ClientCredentialsConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //discovery endpoint - 發現終結點
            HttpClient client = new HttpClient();
            DiscoveryDocumentResponse disco =
                await client.GetDiscoveryDocumentAsync("http://localhost:5000");
            if (disco.IsError)
            {
                Console.WriteLine($"[DiscoveryDocumentResponse Error]: {disco.Error}");
                return;
            }

            //request access token - 請求訪問令牌
            TokenResponse tokenResponse = await client.RequestClientCredentialsTokenAsync(
                new ClientCredentialsTokenRequest
                {
                    Address = disco.TokenEndpoint,
                    ClientId = "client",
                    ClientSecret = "secret",
                    Scope = "api1"
                });
            if (tokenResponse.IsError)
            {
                Console.WriteLine($"[TokenResponse Error]: {tokenResponse.Error}");
                return;
            }
            else
            {
                Console.WriteLine($"Access Token: {tokenResponse.AccessToken}");
            }

            //call API Resource - 訪問API資源
            HttpClient apiClient = new HttpClient();
            apiClient.SetBearerToken(tokenResponse.AccessToken);
            HttpResponseMessage response = await apiClient.GetAsync("http://localhost:6000/weatherforecast");
            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine($"API Request Error, StatusCode is : {response.StatusCode}");
            }
            else
            {
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(JArray.Parse(content));
            }

            Console.ReadKey();
        }
    }
}

四、先將IdentityServer受權服務器、API項目運行起來,再運行控制檯項目。url

建立了兩個批命令,用於快速啓動項目spa

 

 

 

> IdentityServercode

cd IdentityServer/bin/Debug/netcoreapp3.1
dotnet IdentityServer.dll --urls "http://*:5000"

> WebApplication1

cd WebApplication1/bin/Debug/netcoreapp3.1
dotnet WebApplication1.dll --urls "http://*:6000"

運行結果:

 

 能夠看到,成功獲取到AccessToken,並使用AccessToken訪問到受保護的API獲取到結果。

相關文章
相關標籤/搜索