天天看點

IdentityServer4(8)- 使用密碼認證方式控制API通路(資源所有者密碼授權模式)

一.前言

本文已經更新到 .NET Core 2.2

OAuth 2.0 資源所有者密碼模式允許用戶端向令牌服務發送使用者名和密碼,并擷取代表該使用者的通路令牌。

除了通過無法浏覽器進行互動的應用程式之外,通常建議不要使用資源所有者密碼模式。 一般來說,當您要對使用者進行身份驗證并請求通路令牌時,使用其中一個互動式 OpenID Connect 流程通常要好得多。

在這裡使用這種模式是為了學習如何快速在 IdentityServer 中使用它,

二.添加使用者

就像API資源(也稱為 Scope)、用戶端一樣,使用者也有一個基于記憶體存儲(In-Memory)的實作。

有關如何正确存儲(持久化存儲)和管理使用者帳戶的詳細資訊,請檢視基于 ASP.NET Identity的快速入門。

TestUser

類代表測試使用者及其身份資訊單元(Claim)。 讓我們通過在

config

類中添加以下代碼來建立幾個使用者:

首先添加以下語句 到

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 所使用(我們将在下一個快速入門中用到登入 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區分代表用戶端的調用和代表使用者的調用。

下面這張圖,是了解的用戶端請求流程,

IdentityServer4(8)- 使用密碼認證方式控制API通路(資源所有者密碼授權模式)
關于上圖的補充說明,這裡講一下。api資源收到第一個請求之後,會去id4伺服器公鑰,然後用公鑰驗證token是否合法,如果合法進行後面後面的有效性驗證。有且隻有第一個請求才會去id4伺服器請求公鑰,後面的請求都會用第一次請求的公鑰來驗證,這也是jwt去中心化驗證的思想。

五.使用Postman調試

使用postman調用生成token接口需要配置如下參數:

IdentityServer4(8)- 使用密碼認證方式控制API通路(資源所有者密碼授權模式)

最後github位址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 如果你覺得對你有用,歡迎star

目前學習.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程

.NET Core 交流群:923036995  歡迎加群交流

如果您認為這篇文章還不錯或者有所收獲,您可以點選右下角的【推薦】支援,或請我喝杯咖啡【贊賞】,這将是我繼續寫作,分享的最大動力!

作者:曉晨Master(李志強)

聲明:原創部落格請在轉載時保留原文連結或者在文章開頭加上本人部落格位址,如發現錯誤,歡迎批評指正。凡是轉載于本人的文章,不能設定打賞功能,如有特殊需求請與本人聯系!

繼續閱讀