IdentityServer4 中文文檔 -10- (快速入門)使用密碼保護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 的用戶認證


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM