使用IdentityServer保護API的最基本場景。html
咱們定義一個API和要訪問API的客戶端。客戶端從IdentityServer請求AccessToken,而後訪問對應的API。json
IdentityServer的ASP.NET Core Web空項目,端口5000api
Api的ASP.NET Core Web API項目,端口5001瀏覽器
Client的控制檯項目ide
定義API資源工具
定義客戶端post
配置IdentityServer3d
運行IdentityServer項目(自宿主)並在瀏覽器中輸入地址:http://localhost:5000/.well-known/openid-configuration既能夠看到IdentityServer的各類元數據信息,能夠使用在線json格式化工具顯示以下:code
在API控制器上,增長[Authorize]特性(受權)視頻
startup增長以下代碼:
AddAuthentication將身份認證添加到DI,使用"Bearer"方案。AddIdentityServerAuthentication將IdentityServer Token認證處理程序添加到DI,供身份認證服務使用。配置提供Token的基地址爲:"http://localhost:5000",不使用https。
若是此時使用postman訪問:http://localhost:5001/api/values,則會獲得401的結果
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調用