繼續上次授權的內容,客戶端模式後我們再說以下密碼模式,先回顧下密碼模式的流程:
我們還是使用上次的代碼,在那基礎上修改,在IdentityServer4裏面有一個IdentityServer4.Test的引用,它裏面包含了測試用戶的類,我們先將這個引用添加進來,並配置我們的用戶信息,修改Config類,添加一個GetTestUsers()方法,當然在實際項目中,我們需要去從我們的數據庫中去讀取用戶名及密碼等信息,這裏只做測試,添加內容如下:
我們再添加一個客戶端,更改其授權模式爲密碼模式,內容如下:
修改其授權模式爲ResourceOwnerPassword,下面再將我們的用戶依賴注入到系統中,
至此我們的授權服務器已經修改完成,我們通過Postman測試是否可以拿到我們的access_token
OK,測試成功。我們的Api是不需要改動的,下面我們再新創建一個第三方應用程序,去請求授權並獲取資源,代碼如下
using System;
using System.Net.Http;
using IdentityModel;
using IdentityModel.Client;
namespace ThirdPartyAppByPwd
{
class Program
{
static void Main(string[] args)
{
//請求授權服務器
var diso=DiscoveryClient.GetAsync("http://localhost:5000").Result;
if(diso.IsError)
{
Console.WriteLine(diso.Error);
}
//授權服務器根據客戶端發來的請求返回令牌
var tokenClient=new TokenClient(diso.TokenEndpoint,"pwdClient","pwdSecrect");
//使用密碼模式
var tokenResponse =tokenClient.RequestResourceOwnerPasswordAsync("allen","123456","api").Result;
if(tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
}
//如果成功,則打印輸出返回的令牌信息
else
{
Console.WriteLine(tokenResponse.Json);
}
//創建HttpClient對象
var httpClient=new HttpClient();
//設置Authorization的Value值
httpClient.SetBearerToken(tokenResponse.AccessToken);
//根據授權服務器返回的令牌信息請求Api資源
var response= httpClient.GetAsync("http://localhost:5001/api/values").Result;
//如果返回結果爲成功,輸出Api資源的結果
if(response.IsSuccessStatusCode)
{
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
}
}
}
只改動了兩個地方,把ClientID和ClientSecret的值修改了,以及請求授權服務器的方法改爲:
RequestResourceOwnerPasswordAsync(username,password,scope),運行結果如下:
以上就是完整的密碼模式的授權,下面是對以上的簡化流程:
掃描二維碼關注我的公衆號,共同學習,共同進步!