IdentityServer4(8)- 使用密碼認證方式控制API訪問(資源全部者密碼受權模式)

一.前言

本文已經更新到 .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

  • 爲資源全部者密碼受權添加支持
  • 添加對用戶相關服務的支持,這服務一般爲登陸 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區分表明客戶端的調用和表明用戶的調用。

下面這張圖,是理解的客戶端請求流程,

關於上圖的補充說明,這裏講一下。api資源收到第一個請求以後,會去id4服務器公鑰,而後用公鑰驗證token是否合法,若是合法進行後面後面的有效性驗證。有且只有第一個請求才會去id4服務器請求公鑰,後面的請求都會用第一次請求的公鑰來驗證,這也是jwt去中心化驗證的思想。

五.使用Postman調試

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

最後github地址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 若是你以爲對你有用,歡迎star

相關文章
相關標籤/搜索