IdentityServer4 快速入門#2: 使用資源所有者密碼授予保護API安全

此快速入門增加了對OAuth 2.0資源所有者密碼授予的支持。 這允許客戶端將用戶名和密碼發送到Identityserver,以請求代表該用戶的令牌。

注意僅建議對所謂的“受信任的客戶端”使用資源所有者密碼授予-在許多情況下,最好使用基于OpenID Connect的用戶身份驗證流程。 但是,此示例允許以簡單的方式將用戶引入Identityserver-這就是我們將其包括在內的原因。

講解
與該示例一起提供的教程可在此處找到使用密碼保護API

注意

對于任何先決條件(例如模板),請先查看概述。

OAuth 2.0資源所有者密碼授予功能允許客戶端將用戶名和密碼發送到令牌服務,并獲得代表該用戶的訪問令牌。

規范通常建議不要使用不能托管瀏覽器的舊版應用程序,而不使用資源所有者密碼授予。 一般來說,當您要驗證用戶身份并請求訪問令牌時,使用交互式OpenID Connect流之一通常會更好。

不過,這種授權類型使我們可以將用戶的概念引入我們的快速入門IdentityServer中,這就是我們展示它的原因。

添加用戶

就像在內存中存儲資源(即合并范圍)和客戶端一樣,也有一個供用戶使用。

注意

檢查基于ASP.NET身份的快速入門,以獲取有關如何正確存儲和管理用戶帳戶的更多信息。

TestUser類代表測試用戶及其聲明。 讓我們通過將以下代碼添加到配置類中來創建幾個用戶:
首先,將以下using語句添加到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)
{
    // 使用內存中的存儲,密鑰,客戶端和作用域配置身份服務器
    services.AddIdentityServer()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers());
}

AddTestUsers擴展方法在后臺執行了一些操作

  • 增加了對資源所有者密碼授予的支持
  • 為通常由登錄用戶界面使用的用戶相關服務提供支持(我們將在下一個快速入門中使用它)
  • 增加了對基于測試用戶的配置文件服務的支持(您將在下一個快速入門中了解有關此信息的更多信息)

為資源所有者密碼授予添加客戶端

您可以通過更改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" }
        }
    };
}

使用密碼授予請求令牌

將新的控制臺客戶端添加到您的解決方案。

新客戶端看起來與我們為客戶端憑據授予所做的非常相似。 現在的主要區別在于,客戶端將以某種方式收集用戶的密碼,并在令牌請求期間將其發送到令牌服務。

IdentityModel可以再次在這里提供幫助:

// 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端點時,與客戶端憑據授予相比,您會注意到一個很小但重要的區別。 現在,訪問令牌將包含一個唯一聲明用戶的子聲明。 可以通過在調用API之后檢查內容變量來查看此“附屬”聲明,并且該聲明也將由控制臺應用程序顯示在屏幕上。

從屬權利要求的存在(或不存在)使API可以區分代表客戶端的調用和代表用戶的調用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容