国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

這篇具有很好參考價值的文章主要介紹了在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Keycloak是一個功能強大的開源身份和訪問管理系統(tǒng),提供了一整套解決方案,包括用戶認證、單點登錄(SSO)、身份聯(lián)合、用戶注冊、用戶管理、角色映射、多因素認證和訪問控制等。它廣泛應(yīng)用于企業(yè)和云服務(wù),可以簡化和統(tǒng)一不同應(yīng)用程序和服務(wù)的安全管理,支持自托管或云部署,適用于需要安全、靈活且易于擴展的用戶身份管理和訪問控制的場景。

SaaS(Software as a Service,軟件即服務(wù))是一種軟件分發(fā)模式,其中軟件應(yīng)用程序通過互聯(lián)網(wǎng)托管并由服務(wù)提供商管理。用戶通常通過訂閱模式訪問這些服務(wù),而不是購買和安裝軟件。SaaS應(yīng)用程序通常部署在云環(huán)境中,只要用戶有互聯(lián)網(wǎng)連接,他們就可以隨時隨地訪問服務(wù)。在SaaS應(yīng)用中,多租戶支持是關(guān)鍵需求之一。在多租戶環(huán)境中,一個服務(wù)實例需要為多個租戶(即不同的公司、組織或個人用戶)提供服務(wù),同時保障數(shù)據(jù)隔離和安全性。因此,多租戶的支持也成為了與SaaS應(yīng)用集成的身份和訪問管理(IAM)服務(wù)的基本需求,在選用Keycloak作為SaaS應(yīng)用IAM服務(wù)的場景下,對于多租戶模式的支持,也是Keycloak實施的一個關(guān)鍵需求。

Keycloak中的基本概念及其之間的關(guān)系

要理解Keycloak對于多租戶的支持方式,首先需要了解Keycloak中的一些基本概念以及它們之間的關(guān)系。當然,本文不會詳細解釋這些概念是什么,Keycloak的官方文檔里有詳細的解釋,了解這部分內(nèi)容將有助于選擇以何種方式實現(xiàn)多租戶。

下圖簡要描述了Keycloak中的一些主要的基本概念及其之間的關(guān)系:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在一個Keycloak的部署中包含多個Realm,Realm是一個管理的域,它作為頂層組織單元,用來封裝和管理一組用戶、角色、群組和客戶端(即應(yīng)用程序或服務(wù))。每個Realm可以有自己的一套用戶目錄、身份驗證和授權(quán)規(guī)則、客戶端配置以及其他安全性設(shè)置,不同的Realm之間是相互隔離的。在一個Realm中,可以創(chuàng)建多個Client,Client是一個非常重要的概念,它代表了可以請求Keycloak進行認證和授權(quán)的實體。在OAuth 2.0和OpenID Connect(OIDC)的上下文中,客戶端通常指的是一個應(yīng)用程序,它希望使用Keycloak作為身份提供者來驗證用戶的身份,并可能獲取用戶授權(quán)的令牌,以便訪問受保護的資源。在不同的Client下,可以創(chuàng)建互相隔離的一組Client Role,也就是Client下的角色,一個角色可以關(guān)聯(lián)到多個用戶(user)或者用戶組(group)上。與此同時,Client下還可以有一組Client Scope,而Client Scope還可以映射到某個或者某些用戶信息屬性(user profile attribute)上,而用戶信息屬性(user profile attribute)則可以是定義在用戶(user)上的自定義屬性。

Keycloak中多租戶的不同模式

從上面的結(jié)構(gòu)可以分析得出,Keycloak對多租戶的支持主要有兩種模式:

  1. 每個租戶(tenant)使用獨立的Realm,即Realm per tenant模式
  2. 所有租戶共享同一個Realm,但使用不同的Client,即Single Realm模式

需要根據(jù)不同需求來選擇不同的模式。

Realm per Tenant

這種模式的實現(xiàn)比較簡單清晰:數(shù)據(jù)嚴格隔離,簡單地按照上圖中的關(guān)系對Realm進行配置就行了,比如,在Realm下可以直接創(chuàng)建用戶組,這些用戶組就是屬于當前這個租戶的;但另一方面,由于不同的Realm擁有完全不同的一套用戶(user)和用戶組(group)數(shù)據(jù),于是,Realm per Tenant無法實現(xiàn)某個用戶同時屬于多個租戶的場景。你可以在不同的租戶中創(chuàng)建名字和電子郵件地址完全相同的用戶,但是,它們雖然名字相同,卻是完全不同的兩個實體。除此之外,當租戶數(shù)量越來越大時,Realm的個數(shù)也會相應(yīng)增加,對于Keycloak來說也存在一定的性能影響(我沒有實際測試過,但是根據(jù)目前來自各方面的文檔資料,Keycloak維護上百個Realm還是沒有太大問題的)。

Single Realm

在Single Realm模式下,每個租戶就是一個Client,好處是用戶及用戶組可以屬于多個租戶,比如:A用戶可以同時屬于T1和T2兩個租戶,也不必考慮Realm太多影響性能。每個Client都可以配置不同的登錄選項,因此,可以滿足多租戶的需求。但實現(xiàn)這種模式相對比較復(fù)雜,而且有些信息比如用戶的角色、所屬的用戶組等會全部出現(xiàn)在用戶的access token里,而這些信息有些是屬于特定租戶的,其數(shù)據(jù)隔離性沒有Realm per Tenant模式好。

使用Single Realm實現(xiàn)多租戶的一般思路是,針對每一個租戶創(chuàng)建一個Client,所以在這個Realm下,用戶是跨租戶的,用戶組理論上也是跨租戶的,但是,可以對不同的租戶,設(shè)置不同的用戶組,然后在這個租戶級別的用戶組下,還可以創(chuàng)建子組,所以,用戶組也可以做到按租戶隔離。對于角色而言,Client下本身就可以分配不同的角色,所要做的就是將用戶/用戶組分配到不同的角色上,只不過選擇角色的時候需要指定,是分配到哪個Client下的哪個角色。

演練:在Keycloak中配置Single Realm多租戶模式

注意:本文演練部分基于Keycloak 24.0.2,對于其它版本的Keycloak,界面操作可能會有出入。

創(chuàng)建一個新的Realm

啟動Keycloak本地開發(fā)環(huán)境,推薦使用docker,可以參考這篇文章。啟動成功后,用admin/admin登錄管理界面,點擊界面左邊的Keycloak下拉框,然后點擊Create realm按鈕,以創(chuàng)建一個新的Realm。

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在Create realm界面,只需要輸入Realm name即可,例如:multitenant,然后點擊Create按鈕,系統(tǒng)提示Realm created successfully,表示Realm創(chuàng)建成功。

創(chuàng)建對應(yīng)于租戶的Client

接下來,在側(cè)邊欄中點擊Clients鏈接,打開Clients列表界面,在界面中,點擊Create client,注意:這里我們就是為某個租戶創(chuàng)建一個Client,因此,可以考慮用租戶的名稱來命名這個Client,假設(shè)我們客戶的名字叫Globex Corporation,于是,Client就命名為globex。在Create client界面中,Client ID填globex,然后點擊Next按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在Capability config下,啟用Client authentication,Authorization也可以考慮啟用,在Authentication flow中,暫時先勾選Direct access grants,以便后面的測試。在OIDC的Authorization Code Flow和Authorization Code Flow /w PKCE兩種flow下,該選項可以關(guān)閉,當然,具體的可以根據(jù)項目實際情況選擇。這部分的配置如下:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

點擊Next按鈕,在Login settings頁面,可以無需修改配置,直接點擊Save按鈕,此時Client創(chuàng)建成功。

配置Client scopes

在左側(cè)側(cè)邊欄,點擊Client scopes,然后點擊Create client scope按鈕,在Create client scope頁面中,輸入Client scope名稱,其它的默認就行,然后點擊Save按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在新創(chuàng)建的Client scope下,點擊Mappers標簽頁,然后點擊Configure a new mapper按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在Configure a new mapper列表中,找到Group Membership,直接點擊選中,然后在Add mapper頁面下,輸入Mapper的名字,然后Token Claim Name也指定一下,其它的開關(guān)按鈕保持默認就行。這里注意的是,Token Claim Name并不是必須的,但是如果你希望它出現(xiàn)在用戶的access token中,那么這個是必填的:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

完成配置后點擊Save按鈕保存配置。然后回到Clients列表,點擊剛剛新建的Client:globex,進入Client scopes標簽頁,單擊Add client scope按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在彈出的Add client scopes to globex對話框中,選擇剛剛新建的Client scope,然后點擊Add -> Default按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

配置用戶(user)和用戶組(group)

注意:此處配置的用戶和用戶組是跨多租戶,也就是跨多個Client的,之后會在Client的Role下通過角色關(guān)聯(lián)來將用戶關(guān)聯(lián)到租戶上。

在左邊側(cè)邊欄點擊Users鏈接,在Users界面中,點擊Create new user按鈕,然后在General部分輸入Username,其它信息可以按需填寫,然后點擊Create按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在用戶詳細信息頁面中,點擊Credentials選項卡,然后點擊Set password按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在彈出的對話框中,輸入密碼,然后關(guān)閉Temporary選項,再點擊Save按鈕,在確認對話框中,點擊紅色的Save password按鈕即可:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在左側(cè)側(cè)邊欄點擊Groups鏈接,然后點擊Create group按鈕,在彈出的Create a group對話框中,輸入組名。由于我們希望不同租戶具有不同的組配置策略,也就是租戶的用戶組也需要隔離,因此,在這里組名就使用租戶的名稱,也就是globex。然后點擊Create按鈕創(chuàng)建組。在成功創(chuàng)建組之后,點擊Members選項卡,然后點擊Add member按鈕,在彈出的Add member對話框中,將剛剛新建的super用戶添加到globex組中。

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

一個對應(yīng)于租戶的組(比如這里的globex組)下還可以創(chuàng)建多個子用戶組,也就可以定義針對不同租戶的用戶組層次結(jié)構(gòu)。

配置用戶/用戶組角色

點擊左邊側(cè)邊欄的Clients鏈接,在Clients列表中,點擊globex Client,在Roles選項卡下,點擊Create role按鈕,新建一個角色,比如administrator,然后點擊Save按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

回到Users或者Groups界面,選擇某個用戶或者用戶組,比如選擇剛剛新建的super用戶,在用戶的Role mapping選項卡下,點擊Assign role按鈕:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

在Assign roles to super對話框中,點擊Filter by realm roles下拉框,選擇Filter by clients,然后選擇globex這個Client的administrator角色,表示需要將globex租戶的administrator角色分配給super用戶:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

測試我們的配置

點擊左側(cè)側(cè)邊欄的Clients鏈接,然后選擇globex Client,進入Credentials選項卡,在Client Secret部分點擊復(fù)制按鈕,將Client Secret復(fù)制到剪貼板中,然后打開Postman,使用下面的HTTP請求:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

  • POST URL為http://<server>:<port>/realms/<realm>/protocol/openid-connect/token
  • grant_type:password
  • client_id:租戶的名稱,globex
  • client_secret:上一步復(fù)制到剪貼板的內(nèi)容
  • password:用戶密碼
  • username:用戶名稱

點擊Send按鈕后,即可得到access token。打開https://jwt.io,將access token復(fù)制到Debugger的Encoded部分,即可解出access token的明文:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

詳細內(nèi)容類似如下:

{
  "exp": 1712410272,
  "iat": 1712409972,
  "jti": "8f18192e-c223-4f60-a23d-6e825f5e6b37",
  "iss": "http://localhost:5600/realms/multitenant",
  "aud": "account",
  "sub": "1a666edc-36c2-4704-ac14-2a8d88332781",
  "typ": "Bearer",
  "azp": "globex",
  "session_state": "448c536c-3f11-4275-b03c-78bec00deb56",
  "acr": "1",
  "allowed-origins": [
    "/*"
  ],
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization",
      "default-roles-multitenant"
    ]
  },
  "resource_access": {
    "globex": {
      "roles": [
        "administrator"
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  "scope": "email profile",
  "sid": "448c536c-3f11-4275-b03c-78bec00deb56",
  "email_verified": false,
  "name": "Super Admin",
  "groups": [
    "/globex"
  ],
  "preferred_username": "super",
  "given_name": "Super",
  "family_name": "Admin",
  "email": "super@globex.com"
}

可以看到:

  1. azp代表了當前請求access token的租戶名稱
  2. resource_access下列出了該用戶所屬的租戶名稱,以及在每個租戶下所屬的角色
  3. groups下列出了該用戶所屬的用戶組,很遺憾,這里它會將所有該用戶所屬的用戶組列出來,比如,如果還存在另一個租戶soylent,那么,這個groups數(shù)組里就會出現(xiàn)/soylent這個項目。在實際項目中,可以在Action Filter中,通過代碼來處理這個信息

與ASP.NET Core Web API的集成

此時可以新建一個ASP.NET Core Web API應(yīng)用程序,集成Keycloak身份認證,來查看在User Principle上可以拿到哪些數(shù)據(jù)。修改Program.cs文件,加入這些代碼:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "http://localhost:5600/realms/multitenant";
        options.MetadataAddress = 
            "http://localhost:5600/realms/multitenant/.well-known/openid-configuration";
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            NameClaimType = "preferred_username",
            RoleClaimType = ClaimTypes.Role,
            ValidateIssuer = true,
            ValidateAudience = false
        };
    });

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

然后,在Controller上加入[Authorize]特性:

[ApiController]
[Authorize]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
  // 省略N行
}

在某個Controller Action方法上設(shè)置一個調(diào)試斷點,然后啟動ASP.NET Core Web API應(yīng)用程序。接下來,在Postman中調(diào)用這個設(shè)置了調(diào)試斷點的API服務(wù),記得Authorization選擇Bearer Token,然后將上面通過Postman獲得的access_token作為Bearer Token填入,發(fā)起請求。此時,Visual Studio中斷點會被命中,查看User對象,可以看到,有關(guān)租戶的一些信息已經(jīng)在User的Claims下:

在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證

之后,只需利用這些信息來實現(xiàn)用戶授權(quán)即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-844126.html

到了這里,關(guān)于在Keycloak中實現(xiàn)多租戶并在ASP.NET Core下進行驗證的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 實戰(zhàn)指南:使用 xUnit 和 ASP.NET Core 進行集成測試【完整教程】

    實戰(zhàn)指南:使用 xUnit 和 ASP.NET Core 進行集成測試【完整教程】

    集成測試可在包含應(yīng)用支持基礎(chǔ)結(jié)構(gòu)(如數(shù)據(jù)庫、文件系統(tǒng)和網(wǎng)絡(luò))的級別上確保應(yīng)用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和內(nèi)存中測試服務(wù)器結(jié)合使用來支持集成測試。 集成測試與單元測試相比,能夠在更廣泛的級別上評估應(yīng)用的組件,確認多個

    2024年04月22日
    瀏覽(30)
  • 【.Net Core】ShardingCore分庫分表解決方案之多租戶

    【.Net Core】ShardingCore分庫分表解決方案之多租戶

    GitHub地址 ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業(yè)務(wù)代碼入侵 dotnet下唯一一款全自動分表,多字段分表框架,擁有高性能,零依賴、零學習成本、零業(yè)務(wù)代碼入侵,并且支持讀寫分離動態(tài)分表分庫,同一種路由可以完

    2024年02月08日
    瀏覽(93)
  • ASP.NET Core教程:ASP.NET Core 程序部署到Windows系統(tǒng)

    ASP.NET Core教程:ASP.NET Core 程序部署到Windows系統(tǒng)

    本篇文章介紹如何將一個ASP.NET Core Web程序部署到Windows系統(tǒng)上。這里以ASP.NET Core WebApi為例進行講解。首先創(chuàng)建一個ASP.NET Core WebApi項目,使用默認的Values控制器,這里使用Visual Studio 2019創(chuàng)建一個ASP.NET Core 3.1d的WebApi項目。 創(chuàng)建新項目的時候選項ASP.NET Core Web應(yīng)用程序,如下圖所

    2023年04月08日
    瀏覽(103)
  • ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    右鍵單擊“視圖”文件夾,然后單擊“添加”“新文件夾”,并將文件夾命名為“HelloWorld”。 右鍵單擊“Views/HelloWorld”文件夾,然后單擊“添加”“新項”。 在“添加新項 - MvcMovie”對話框中: 在右上角的搜索框中,輸入“視圖” 選擇“Razor 視圖 - 空” 保持“名稱”框的

    2024年02月13日
    瀏覽(127)
  • ASP.NET和ASP.NET Core的區(qū)別

    ASP.NET和ASP.NET Core是兩個不同的Web應(yīng)用程序框架,它們都是由Microsoft開發(fā)的。ASP.NET是Microsoft推出的第一個Web應(yīng)用程序框架,而ASP.NET Core是其最新版本。本文將介紹ASP.NET和ASP.NET Core的簡介和區(qū)別。 ASP.NET的簡介 ASP.NET是一個基于.NET框架的Web應(yīng)用程序框架,它是Microsoft推出的第一

    2024年02月16日
    瀏覽(96)
  • Asp.Net VS ASP.NET Core 請求管道

    Asp.Net VS ASP.NET Core 請求管道

    參考鏈接 ASP.NET CORE 啟動過程及源碼解讀 請求進入Asp.Net工作進程后,由進程創(chuàng)建HttpWorkRequest對象,封裝此次請求有關(guān)的所有信息,然后進入HttpRuntime類進行進一步處理。HttpRuntime通過請求信息創(chuàng)建HttpContext上下文對象,此對象將貫穿整個管道,直到響應(yīng)結(jié)束。同時創(chuàng)建或從應(yīng)用

    2024年02月04日
    瀏覽(100)
  • 【ASP.NET Core 基礎(chǔ)知識】--最佳實踐和進階主題--設(shè)計模式在ASP.NET Core中的應(yīng)用

    一、設(shè)計模式概述 1.1 什么是設(shè)計模式 設(shè)計模式是在軟件設(shè)計過程中反復(fù)出現(xiàn)的、經(jīng)過驗證的、可重用的解決問題的方法。它們是針對特定問題的通用解決方案,提供了一種在軟件開發(fā)中可靠的指導和標準化方法。設(shè)計模式通常描述了一種在特定情景下的解決方案,包括了問

    2024年02月21日
    瀏覽(850)
  • ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    我之前稍微研究了一下SignalR Core。用起來還行。簡單來說SignalR就是用來解決實時通訊的問題的。 ASP.NET Core SingleR:初次體驗和簡單項目搭建 SignalR支持三種客戶端,C#,Java,JavaScirpt?;緣蛴昧恕1旧砭褪俏④涢_發(fā)的,肯定支持自己的語言。因為是Websocket的上層封裝,所以也要支

    2024年01月20日
    瀏覽(575)
  • ASP.NET Core —配置系統(tǒng)

    ASP.NET Core —配置系統(tǒng)

    一個應(yīng)用要運行起來,往往需要讀取很多的預(yù)設(shè)好的配置信息,根據(jù)約定好的信息或方式執(zhí)行一定的行為。 配置的本質(zhì)就是軟件運行的參數(shù),在一個軟件實現(xiàn)中需要的參數(shù)非常多,如果我們以 Hard Code (硬編碼)的方式寫在應(yīng)用代碼中,這樣配置就會很亂,而且后續(xù)也不容易修

    2024年02月08日
    瀏覽(20)
  • Asp.Net Core 6 - 概述

    Q: 什么是 .NET? A:.NET 是一個開發(fā)人員平臺,由工具、編程語言、庫組成,用于構(gòu)建許多不同類型的應(yīng)用程序。使用 .NET,可以使用多種語言、編輯器和庫來構(gòu)建 Web、移動、桌面、游戲和 IoT 等,可以使用 C#、F# 或 Visual Basic 編寫 .NET 應(yīng)用。 .NET 發(fā)展至今,出現(xiàn)了兩種實現(xiàn) n

    2024年02月06日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包