1. 程式人生 > >IdentityServer4主題之定義資源

IdentityServer4主題之定義資源

我們 ren end 類型 isp sha256 script 範圍 密鑰

Defining Resources 定義資源

你在系統中通常定義的第一件事是你想要保護的資源。這可能是你的用戶的身份信息,比如個人資料數據或電子郵件地址,或者訪問api。

你可以通過C#對象模型(內存中的)--或者加載數據庫資源(數據庫中的)來定義資源。一個IResouceStore的實現來處理這些底層的細節。對於這篇文檔來說我們使用的是基於內存中的實現。

Defining identity resources 定義IdentityResource

一個用戶的ID、名字、郵件地址等這些信息,都可以看成是資源,有一個更好的名字是Identity resource,還有一個api resource,後面會講。這兩種都被IdentityServer4當作了資源。一個是用戶範疇的,另一個是api範疇的。一個Identity resource有一個唯一的名字作為標識符,並且你可以給一個identity resource賦予任意類型的聲明(claim)類型。這些聲明(claim)之後會被包含在一個Identity token(ID token)中。第三方的客戶端使用”scope“這個參數來請求一個identity resource。

OpenID Connect規範中制定了一些標準的identity resource。最基本的要求是你為你的用戶放出一個唯一的ID,這個ID通常也叫做subject id。這個過程是通過暴露一個叫做openid的標準identity resource來完成的。

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId()
    };
}

IdentityResources類(註意是復數)涵蓋了規範中(上面提到的)定義了的所有範圍(openid、email、profile、telephone和address)如果想要支持他們,就在方法中進行引入:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Email(),
        
new IdentityResources.Profile(), new IdentityResources.Phone(), new IdentityResources.Address() }; }

Defining custom identity resources 定義自定義的Identity Resource

你當然可以定義自定義的Identity Resource。通過new創建一個IdentityResource的類實例,給它一個名字和一些其他的選項比如displayname、description等等並且當這個resource被請求時定義哪些claim可以被包含進Identity token裏面。

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    var customProfile = new IdentityResource(
        name: "custom.profile",
        displayName: "Custom profile",
        claimTypes: new[] { "name", "email", "status" });

    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
        customProfile
    };
}

通過這裏查看關於IdentityResource的更多信息。

Defining API resources 定義ApiResource

如果要允許第三方客戶端請求access token(訪問令牌)並以此訪問客戶端,你需要定義ApiResource(api資源),例如:

為了獲得訪問api的access token(訪問令牌),您還需要將它們註冊為一個範圍(scope)。這一次,範圍類型是資源:

public static IEnumerable<ApiResource> GetApis()
{
    return new[]
    {
       //簡單的API只有一個scope(下面這個代碼中的scope名稱就和ApiResource的名稱是一樣的)
        new ApiResource("api1", "Some API 1"),

        // 擴展版本:如果你需要更多的控制
        new ApiResource
        {
            Name = "api2",

            // 使用introspection endpoint的密鑰
            ApiSecrets =
            {
                new Secret("secret".Sha256())
            },

            // 下面的代碼會在訪問令牌(access token)中增加除了subject id以外其他的用戶聲明(claim)
            UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.Email },

            // 這個ApiResource定義了兩個scope
            Scopes =
            {
                new Scope()
                {
                    Name = "api2.full_access",
                    DisplayName = "Full access to API 2",
                },
                new Scope
                {
                    Name = "api2.read_only",
                    DisplayName = "Read only access to API 2"
                }
            }
        }
    };
}

點擊這裏查看更多關於ApiResource的信息.

註意:ApiResource中定義的UesrClaims屬性可以由IProfileService這個擴展點來加載(也就是可以加載一些我們自定義的聲明)。

IdentityServer4主題之定義資源