IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
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 的用戶認證