IdentityServer4主題之定義資源
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主題之定義資源