本文已經更新到 .NET Core 2.2git
OAuth 2.0 資源全部者密碼模式容許客戶端向令牌服務發送用戶名和密碼,並獲取表明該用戶的訪問令牌。github
除了經過沒法瀏覽器進行交互的應用程序以外,一般建議不要使用資源全部者密碼模式。 通常來講,當您要對用戶進行身份驗證並請求訪問令牌時,使用其中一個交互式 OpenID Connect 流程一般要好得多。api
在這裏使用這種模式是爲了學習如何快速在 IdentityServer 中使用它,瀏覽器
就像API資源(也稱爲 Scope)、客戶端同樣,用戶也有一個基於內存存儲(In-Memory)的實現。服務器
有關如何正確存儲(持久化存儲)和管理用戶賬戶的詳細信息,請查看基於 ASP.NET Identity的快速入門。ide
TestUser
類表明測試用戶及其身份信息單元(Claim)。 讓咱們經過在 config
類中添加如下代碼來建立幾個用戶:post
首先添加如下語句 到Config.cs
文件中:學習
using IdentityServer4.Test; public static List<TestUser> GetUsers() { return new List<TestUser> { new TestUser { SubjectId = "1", Username = "alice", Password = "password" }, new TestUser { SubjectId = "2", Username = "bob", Password = "password" } }; }
而後將測試用戶註冊到 IdentityServer:測試
public void ConfigureServices(IServiceCollection services) { // configure identity server with in-memory stores, keys, clients and scopes services.AddIdentityServer() .AddInMemoryApiResources(Config.GetApiResources()) .AddInMemoryClients(Config.GetClients()) .AddTestUsers(Config.GetUsers()); }
AddTestUsers
方法幫咱們作了如下幾件事:ui
你能夠經過修改 ·AllowedGrantTypes· 屬性簡單地添加對已有客戶端受權類型的支持。
一般你會想要爲資源全部者用例建立獨立的客戶端,添加如下代碼到你配置中的客戶端定義中:
public static IEnumerable<Client> GetClients() { return new List<Client> { // other clients omitted... // resource owner password grant client new Client { ClientId = "ro.client", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = { "api1" } } }; }
建立一個 ResourceOwnerPassword 控制檯項目,經過Nuget添加 IdentityModel
包
經過以下代碼獲取Token
// request token var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = disco.TokenEndpoint, ClientId = "ro.client", ClientSecret = "secret", UserName = "alice", Password = "password", Scope = "api1" }); if (tokenResponse.IsError) { Console.WriteLine(tokenResponse.Error); return; } Console.WriteLine(tokenResponse.Json);
當您將令牌發送到身份API終結點時,您會注意到與客戶端模式相比有一個小但重要的區別。 訪問令牌如今將包含惟一標識用戶的sub
claim。 經過在調用API以後檢查內容變量能夠看到這個「sub」,而且控制器應用程序也會在屏幕上顯示該claim。
sub claim的存在(或不存在)容許API區分表明客戶端的調用和表明用戶的調用。
下面這張圖,是理解的客戶端請求流程,
關於上圖的補充說明,這裏講一下。api資源收到第一個請求以後,會去id4服務器公鑰,而後用公鑰驗證token是否合法,若是合法進行後面後面的有效性驗證。有且只有第一個請求才會去id4服務器請求公鑰,後面的請求都會用第一次請求的公鑰來驗證,這也是jwt去中心化驗證的思想。
使用postman調用生成token接口須要配置以下參數:
最後github地址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 若是你以爲對你有用,歡迎star