IdentityServer4 中文文件 -10- (快速入門)使用密碼保護API
原文:http://docs.identityserver.io/en/release/quickstarts/2_resource_owner_passwords.html
上一篇:IdentityServer4 中文文件 -9- (快速入門)使用客戶端憑證保護API
下一篇:IdentityServer4 中文文件 -11- (快速入門)新增基於 OpenID Connect 的使用者認證
OAuth 2.0 資源所有者密碼授權 允許一個客戶端傳送使用者名稱和密碼到令牌服務並獲得一個表示該使用者的訪問令牌。
(OAuth 2.0) 規範 建議僅對“受信任”的應用程式使用資源所有者密碼授權。一般來說,當你想要驗證一個使用者並請求訪問令牌的時候,使用互動式 OpenID Connect 流通常會更好。
不過,這個授權型別允許我們在 IdentityServer 快速入門中引入 使用者 的概念,這是我們要展示它的原因。
新增使用者
就像基於記憶體儲存的資源(即 範圍 Scopes)和客戶端一樣,對於使用者也可以這樣做。
注意:檢視基於 ASP.NET Identity 的快速入門以獲得更多關於如何正確儲存和管理使用者賬戶的資訊。
TestUser
型別表示一個測試使用者及其身份資訊。讓我們向配置類(如果你有嚴格按照順序進行演練,那麼配置類應該在 QuickstartIdentityServer 專案的 Config.cs 檔案中)中新增以下程式碼以建立一對使用者:
首先新增以下 using 語句 到 Config.cs 檔案中:
public static List<TestUser> GetUsers()
{
return new List<TestUser>()
{
new TestUser
{
SubjectId="1",
Username="愛麗絲",
Password="password"
},
new TestUser
{
SubjectId="2",
Username="博德",
Password="password"
}
};
}
然後將測試使用者註冊到 IdentityServer:
public void ConfigureServices(IServiceCollection services)
{
// 使用記憶體儲存,金鑰,客戶端和資源來配置身份伺服器。
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
AddTestUsers
擴充套件方法在背後做了以下幾件事:
- 為資源所有者密碼授權新增支援
- 新增對使用者相關服務的支援,這服務通常為登入 UI 所使用(我們將在下一個快速入門中用到登入 UI)
- 為基於測試使用者的身份資訊服務新增支援(你將在下一個快速入門中學習更多與之相關的東西)
為資源所有者密碼授權新增一個客戶端定義
你可以通過修改 AllowedGrantTypes
屬性簡單地新增對已有客戶端授權型別的支援。
通常你會想要為資源所有者用例建立獨立的客戶端,新增以下程式碼到你配置中的客戶端定義中:
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
// 省略其他客戶端定義...
// 資源所有者密碼授權客戶端定義
new Client
{
ClientId = "ro.client",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "api1" }
}
};
}
使用密碼授權請求一個令牌
客戶端看起來跟之前 客戶端憑證授權 的客戶端是相似的。主要差別在於現在的客戶端將會以某種方式收集使用者密碼,然後在令牌請求期間傳送到令牌服務。
IdentityModel 的 TokenClient
在這裡再次為我們提了供幫助:
// 請求以獲得令牌
var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret");
var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("愛麗絲","password","api1");
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.Json);
Console.WriteLine("\n\n");
當你傳送令牌到身份 API 端點的時候,你會發現與客戶端憑證授權
相比,資源所有者密碼授權有一個很小但很重要的區別。訪問令牌現在將包含一個 sub
資訊,該資訊是使用者的唯一標識。sub
資訊可以在呼叫 API 後通過檢查內容變數來被檢視,並且也將被控制檯應用程式顯示到螢幕上。
sub
資訊的存在(或缺失)使得 API 能夠區分代表客戶端的呼叫和代表使用者的呼叫。
上一篇:IdentityServer4 中文文件 -9- (快速入門)使用客戶端憑證保護API
下一篇:IdentityServer4 中文文件 -11- (快速入門)新增基於 OpenID Connect 的使用者認證