IdentityServer4[3]:使用客戶端認證控制API訪問(客戶端受權模式)

使用客戶端認證控制API訪問(客戶端受權模式)

場景描述

使用IdentityServer保護API的最基本場景。html

咱們定義一個API和要訪問API的客戶端。客戶端從IdentityServer請求AccessToken,而後訪問對應的API。json

建立項目
  • IdentityServer的ASP.NET Core Web空項目,端口5000api

  • Api的ASP.NET Core Web API項目,端口5001瀏覽器

  • Client的控制檯項目ide

5.png

IdentityServer準備工做

定義API資源工具

1.jpg

定義客戶端post

TIM截圖20190307150120.jpg

配置IdentityServer3d

TIM截圖20190307163327.jpg

運行IdentityServer項目(自宿主)並在瀏覽器中輸入地址:http://localhost:5000/.well-known/openid-configuration既能夠看到IdentityServer的各類元數據信息,能夠使用在線json格式化工具顯示以下:code

TIM截圖20190307152843.jpg

API準備

在API控制器上,增長[Authorize]特性(受權)視頻

TIM截圖20190307154700.jpg

startup增長以下代碼:

TIM截圖20190307154726.jpg

AddAuthentication將身份認證添加到DI,使用"Bearer"方案。AddIdentityServerAuthentication將IdentityServer Token認證處理程序添加到DI,供身份認證服務使用。配置提供Token的基地址爲:"http://localhost:5000",不使用https。

若是此時使用postman訪問:http://localhost:5001/api/values,則會獲得401的結果

TIM截圖20190307154552.jpg

建立客戶端

IdentityModel 包括用於發現 IdentityServer 各個終結點(EndPoint)的客戶端庫。這樣只須要知道 IdentityServer 的地址 - 能夠從元數據中讀取實際的各個終結點地址:

var client = new HttpClient();
var disdoc = client.GetDiscoveryDocumentAsync("http://localhost:5000").Result;
if (disdoc.IsError)
{
 Console.WriteLine(disdoc.Error);
}

獲取token

var tokenResponse = client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
 Address = disdoc.TokenEndpoint,
 ClientId = "client",
 ClientSecret = "secret",
 Scope = "api1"
}).Result;
​
if (tokenResponse.IsError)
{
 Console.WriteLine(tokenResponse.Error);
}
else
{
 Console.WriteLine(tokenResponse.Json);
}

調用API

HttpClient httpClient = new HttpClient();
httpClient.SetBearerToken(tokenResponse.AccessToken);
var response = httpClient.GetAsync("http://localhost:5001/api/values").Result;
if (response.IsSuccessStatusCode)
{
 Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}

使用postman調用

TIM截圖20190307163755.jpg

IdentityServer4 中文文檔與實戰

IdentityServer4 知多少

jessetalk視頻教程

相關文章
相關標籤/搜索