日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在wildfly中使用SAML协议连接keycloak

發(fā)布時間:2024/2/28 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在wildfly中使用SAML协议连接keycloak 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


文章目錄

  • 簡介
  • OpenID Connect和SAML
  • SAML的工作流程
  • 在keycloak中使用SAML
  • 準(zhǔn)備wildfy和應(yīng)用程序

簡介

我們知道SSO的兩個常用的協(xié)議分別是SAML和OpenID Connect,我們在前一篇文章已經(jīng)講過了怎么在wildfly中使用OpenID Connect連接keycloak,今天我們會繼續(xù)講解怎么使用SAML協(xié)議連接keycloak。

OpenID Connect和SAML

OpenID Connect簡稱OIDC,是一個基于OAuth2協(xié)議的認(rèn)證框架。為什么要基于OAuth2框架呢?因為OAuth2協(xié)議只是一個授權(quán)協(xié)議,它是不完備的,并且也沒有指明具體的實現(xiàn)方式。所以這一切都由 OpenID Connect來填補(bǔ)。

OpenID Connect同時包含了認(rèn)證和授權(quán),并且使用Json Web Token(JWT)來進(jìn)行消息的傳遞。

一般來說OpenID Connect有兩種使用場景,第一種場景是某個應(yīng)用程序請求keycloak來幫它認(rèn)證一個用戶。該應(yīng)用程序并不存儲這個用戶的認(rèn)證信息。所以用戶需要在keycloak中進(jìn)行登錄,登錄成功之后keycloak會返回應(yīng)用程序一個identity token 和 access token。

identity token主要包含用戶的基本信息,包括用戶名,郵箱和一些其他的信息。access token主要包含的是用戶的訪問權(quán)限信息,比如說用戶的角色等。應(yīng)用程序可以通過使用access token來判斷用戶到底可以訪問應(yīng)用程序的哪些資源。

還有一種場景就是client想去訪問遠(yuǎn)程服務(wù)的資源,這種情況下client可以先從keycloak中獲取到access token,然后使用這個access token去遠(yuǎn)程服務(wù)中請求資源。遠(yuǎn)程服務(wù)器收到了這個請求之后,會去驗證這個access token,然后根據(jù)token去獲取相應(yīng)的信息。

SAML 2.0是基于XML的認(rèn)證協(xié)議,它是在OIDC之前產(chǎn)生的,所以會比OIDC成熟,但是相應(yīng)的也會比OIDC復(fù)雜。

SAML使用XML在應(yīng)用程序和認(rèn)證服務(wù)器中交換數(shù)據(jù),同樣的SAML也有兩種使用場景。

第一種場景是某個應(yīng)用程序請求keycloak來幫它認(rèn)證一個用戶。該應(yīng)用程序并不存儲這個用戶的認(rèn)證信息。所以用戶需要在keycloak中進(jìn)行登錄,登錄成功之后keycloak會返回應(yīng)用程序一個XML文件,這個文件里面包含了一個叫做SAML assertion的東西,里面存的是用戶的信息,同時這個XML文件中還包含了用戶的權(quán)限信息,應(yīng)用程序可以根據(jù)這個信息來對程序進(jìn)行訪問工作。

還有一種場景就是client想去訪問遠(yuǎn)程服務(wù)的資源,這種情況下client可以先從keycloak中獲取到SAML assertion,然后使用這個SAML assertion去遠(yuǎn)程服務(wù)中請求資源。

所以總結(jié)起來,一般情況下是推薦是用OIDC的,因為它比較簡單和多平臺支持性更強(qiáng)。使用SAML的場景主要考慮的是SAML的成熟性,或者說公司中已經(jīng)在使用了SAML了。

SAML的工作流程

在SAML協(xié)議中定義了三個角色,分別是principal:代表主體通常表示人類用戶。identity provider (IdP)身份提供者和service provider (SP)服務(wù)提供者。

IdP的作用就是進(jìn)行身份認(rèn)證,并且將用戶的認(rèn)證信息和授權(quán)信息傳遞給服務(wù)提供者。

SP的作用就是進(jìn)行用戶認(rèn)證信息的驗證,并且授權(quán)用戶訪問指定的資源信息。

根據(jù)請求方式有redirect和post的不同,使用SAML來進(jìn)行SSO認(rèn)證有通常有三種方式,我們這里介紹最簡單的一種叫做SP redirect request; IdP POST response:

上圖中User Agent就是web瀏覽器,我們看一下如果用戶想請求Service Provider的資源的時候,SAML協(xié)議是怎么處理的。

  • 用戶通過User Agent請求Service Provider,比如:
  • http://sp.flydean.com/myresource

    SP將會對該資源進(jìn)行相應(yīng)的安全檢查,如果發(fā)現(xiàn)已經(jīng)有一個有效的安全上下文的話,SP將會跳過2-7步,直接進(jìn)入第8步。

  • 如果在第一步的時候,SP并沒有找到相應(yīng)的有效安全上下文的話,則會生成對應(yīng)的SAMLRequest,并將User Agent重定向到IdP:
  • 302 Redirect Location: https://idp.flydean.com/SAML2/SSO/Redirect?SAMLRequest=request&RelayState=token

    RelayState是SP維護(hù)的一個狀態(tài)信息,主要用來防止CSRF攻擊。

    其中這個SAMLRequest是用Base64編碼的samlp:AuthnRequest,下面是一個samlp:AuthnRequest的例子:

    <samlp:AuthnRequestxmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"ID="aaf23196-1773-2113-474a-fe114412ab72"Version="2.0"IssueInstant="2020-09-05T09:21:59Z"AssertionConsumerServiceIndex="0"AttributeConsumingServiceIndex="0"><saml:Issuer>https://sp.flydean.com/SAML2</saml:Issuer><samlp:NameIDPolicyAllowCreate="true"Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/></samlp:AuthnRequest>

    為了安全起見,SAMLRequest還可以使用SP提供的簽名key來進(jìn)行簽名。

  • User agent將會發(fā)送一個get請求到IdP的SSO server :
  • GET /SAML2/SSO/Redirect?SAMLRequest=request&RelayState=token HTTP/1.1 Host: idp.flydean.com

    IdP收到這個AuthnRequest請求之后,將會進(jìn)行安全驗證,如果是合法的AuthnRequest,那么將會展示登錄界面。

  • 用戶可以輸入用戶名密碼進(jìn)行登錄。登錄成功之后,IdP將會返回一個XHTML form:
  • <form method="post" action="https://sp.flydean.com/SAML2/SSO/POST" ...><input type="hidden" name="SAMLResponse" value="response" /><input type="hidden" name="RelayState" value="token" />...<input type="submit" value="Submit" /></form>

    這個form中包含了SAMLResponse信息,SAMLResponse中包含了用戶相關(guān)的信息。

    同樣的SAMLResponse也是使用Base64進(jìn)行編碼過的samlp:Response。

    <samlp:Responsexmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"ID="identifier_2"InResponseTo="identifier_1"Version="2.0"IssueInstant="2020-09-05T09:22:05Z"Destination="https://sp.flydean.com/SAML2/SSO/POST"><saml:Issuer>https://idp.flydean.com/SAML2</saml:Issuer><samlp:Status><samlp:StatusCodeValue="urn:oasis:names:tc:SAML:2.0:status:Success"/></samlp:Status><saml:Assertionxmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"ID="identifier_3"Version="2.0"IssueInstant="2020-09-05T09:22:05Z"><saml:Issuer>https://idp.flydean.com/SAML2</saml:Issuer><!-- a POSTed assertion MUST be signed --><ds:Signaturexmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature><saml:Subject><saml:NameIDFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">3f7b3dcf-1674-4ecd-92c8-1544f346baf8</saml:NameID><saml:SubjectConfirmationMethod="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationDataInResponseTo="identifier_1"Recipient="https://sp.flydean.com/SAML2/SSO/POST"NotOnOrAfter="2020-09-05T09:27:05Z"/></saml:SubjectConfirmation></saml:Subject><saml:ConditionsNotBefore="2020-09-05T09:17:05Z"NotOnOrAfter="2020-09-05T09:27:05Z"><saml:AudienceRestriction><saml:Audience>https://sp.flydean.com/SAML2</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatementAuthnInstant="2020-09-05T09:22:00Z"SessionIndex="identifier_3"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement></saml:Assertion></samlp:Response>

    我們可以看到samlp:Response中包含有saml:Assertion信息。

  • user agent 收到XHTML form之后將會提交該form給SP。

  • SP中的assertion consumer service將會處理這個請求,創(chuàng)建相關(guān)的安全上下文,并將user agent重定向到要訪問的資源頁面。

  • user agent再次請求SP資源。

  • 因為安全上下文已經(jīng)創(chuàng)建完畢,SP可以直接返回相應(yīng)的資源,不用再次到IdP進(jìn)行認(rèn)證。

  • 我們可以看到上面的所有的信息交換都是由前端瀏覽器來完成的,在SP和IdP之間不存在直接的通信。

    這種全部由前端來完成信息交換的方式好處就是協(xié)議流非常簡單,所有的消息都是簡單的GET或者POST請求。

    如果為了提高安全性,也可以使用引用消息。也就是說IdP返回的不是直接的SAML assertion,而是一個SAML assertion的引用。SP收到這個引用之后,可以從后臺再去查詢真實的SAML assertion,從而提高了安全性。

    在keycloak中使用SAML

    接下來,我們看下怎么在keycloak中配置使用SAML協(xié)議。

    我們通過./standalone.sh -Djboss.socket.binding.port-offset=100啟動keycloak服務(wù)器。訪問 http://localhost:8180/auth/admin 可以進(jìn)入到admin console界面。

    注意,這里為了和本地應(yīng)用程序的默認(rèn)端口8080區(qū)別,我們添加了一個-Djboss.socket.binding.port-offset=100參數(shù),讓keycloak的端口從8080變成了8180。

    輸入我們創(chuàng)建的admin用戶名和密碼,就可以登錄到keycloak的admin界面。

    這里需要為SAML應(yīng)用創(chuàng)建一個新的client。

    點(diǎn)擊clients-> create 輸入Client ID和Client Protocol: saml,點(diǎn)擊save即可創(chuàng)建新的client。

    成功創(chuàng)建client之后,假設(shè)我們要部署的應(yīng)用程序名叫做app-profile-saml,則需要添加下面的信息:

    Valid Redirect URIs: http://localhost:8080/app-profile-saml/*

    Base URL: http://localhost:8080/app-profile-saml/

    Master SAML Processing URL: http://localhost:8080/app-profile-saml/saml

    Force Name ID Format: ON

    點(diǎn)保存即可。

    接下來我們需要點(diǎn)擊mappers,創(chuàng)建一些用戶信息和token claims的映射信息,從而能夠在saml的請求中包含這些用戶信息。

    為了簡單起見,我們選擇默認(rèn)的Protocol Mapper:

    最后一步,我們需要配置adapter。

    點(diǎn)擊installation,選擇Keycloak SAML Adapter keycloak-saml.xml, 點(diǎn)擊下載。

    將下載下來的keycloak-saml.xml進(jìn)行修改:

    將 logoutPage=“SPECIFY YOUR LOGOUT PAGE!” 修改為 /index.jsp

    將 entityID=“saml-test” 中的entityID修改為我們設(shè)置的entityID

    將keycloak-saml.xml拷貝到我們應(yīng)用程序的config/目錄下。這里我們使用官方的應(yīng)用程序,大家可以在 https://github.com/keycloak/keycloak-quickstarts/tree/latest/app-profile-saml-jee-jsp 進(jìn)行下載。

    在下一節(jié),我們將會詳細(xì)講解這個應(yīng)用程序的功能和結(jié)構(gòu)。

    準(zhǔn)備wildfy和應(yīng)用程序

    我們從wildfly官網(wǎng)下載wildfly應(yīng)用程序之后,還需要到keycloak中下載wildfly Client Adapters。

    這里因為我們使用的是SAML,所以需要下載 keycloak-saml-wildfly-adapter-dist-11.0.2.zip。

    下載完畢之后,將其拷貝到wildfly根目錄,解壓即可。

    解壓adapter,解壓之后,進(jìn)入wildfly/bin目錄,運(yùn)行:

    ./jboss-cli.sh --file=adapter-elytron-install-offline.cli

    即可安裝完畢。

    安裝完畢之后,記得啟動wildfly應(yīng)用程序。

    接下來可以編譯我們的應(yīng)用程序了:

    cd app-profile-saml-jee-jsp mvn clean wildfly:deploy

    即可將我們的應(yīng)用程序部署到wildfly中。

    先看下應(yīng)用的運(yùn)行情況,訪問 http://localhost:8080/app-profile-saml/

    點(diǎn)擊login,可以看到跳轉(zhuǎn)到了keycloak的登錄頁面:

    輸入用戶命名密碼之后就會跳轉(zhuǎn)到profile.jsp頁面,從而展示用戶的profile信息。

    簡單講解一下應(yīng)用程序的工作流程。

    應(yīng)用程序主要有兩個頁面,一個是index,一個是profile。在index頁面會去檢測用戶是否登錄。如果未登錄,可以點(diǎn)擊登錄按鈕,跳轉(zhuǎn)到登錄頁面。

    輸入用戶名和密碼進(jìn)行校驗之后,keycloak會返回一個SAMLResponse給應(yīng)用程序,應(yīng)用程序通過assertion consumer service將會處理這個請求,創(chuàng)建相關(guān)的安全上下文,并將user agent重定向到要訪問的資源頁面。

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/keycloak-saml-wildfly/

    本文來源:flydean的博客

    歡迎關(guān)注我的公眾號:「程序那些事」最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!

    超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的在wildfly中使用SAML协议连接keycloak的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 最近日韩免费视频 | 欧美日韩加勒比 | 国产不卡在线播放 | 国产区免费观看 | 国产麻豆剧传媒精品国产av | 夜夜草网站 | 国产激情毛片 | 日本a天堂 | 一区二区国产视频 | 亚洲欧美一区在线 | 日本中文字幕高清 | 娇妻av| 麻豆国产在线播放 | 国产欧美一区二区三区在线看蜜臀 | 在线免费观看黄网站 | 亚洲国产婷婷香蕉久久久久久99 | 亚洲精品免费视频 | 日本高清网色 | 亚洲国产日韩在线一区 | 国产精品揄拍100视频 | 欧美精品性生活 | 99精品欧美一区二区三区 | 日韩av网站大全 | 亚洲国产精品国自产拍久久 | 99色在线观看 | 东北少妇露脸无套对白 | 欧美videossex另类 | 成人网址在线观看 | 日韩欧美成人一区 | 四虎成人免费视频 | 另类中文字幕 | 国产69熟| 艳妇乳肉豪妇荡乳xxx | 18禁裸乳无遮挡啪啪无码免费 | 久久影视中文字幕 | 国内自拍偷拍 | 欧美成年人视频 | 精品孕妇一区二区三区 | 国产精品30p| 成年人黄色免费视频 | 天天干少妇 | 精品国产乱码一区二区三区99 | 亚洲一区影视 | 亚洲一二三在线 | 99久久精品无码一区二区毛片 | 影音先锋中文字幕一区 | 99国内揄拍国内精品人妻免费 | 成人免费精品 | 亚洲熟妇无码一区二区三区导航 | 北条麻妃二三区 | 亚洲第一色在线 | 中文字幕av一区二区 | 亚洲av无码专区国产乱码不卡 | 操操操操操操操 | 欧美一二三视频 | 操操网 | 高清一区在线观看 | 麻豆国产一区二区三区四区 | 天天操天天射天天 | 人妖被c到高潮欧美gay | 国产黄视频网站 | 亚洲国产精品无码久久久久高潮 | 91久久爽久久爽爽久久片 | 18av在线视频 | 亚洲风情亚aⅴ在线发布 | 国产精品久久久久久免费播放 | 久久精品屋 | 欧日韩一区二区三区 | 国产精品白丝喷水在线观看 | 亚洲欧洲天堂 | 美女被草出白浆 | 97自拍偷拍 | 国产精品主播视频 | 欧美一区二区三区婷婷 | 69视频一区二区三区 | 在线视频啪 | 99热最新在线 | 日韩精品在线免费观看 | 欧美操老女人 | 日韩精品电影在线 | 国产精品久久久久毛片 | www.国产黄色 | 青草一区二区 | 青青导航 | 一区二区三区欧美在线 | 992tv在线成人免费观看 | 成人国产一区二区三区 | 亚洲第一精品在线 | 久久天天东北熟女毛茸茸 | 天天做天天爱 | 欧美精品黄色 | 久久婷婷色综合 | 精品少妇白浆小泬60P | 国产精品精品国产色婷婷 | 校花被c到呻吟求饶 | 欧美91精品久久久久国产性生爱 | 天天色天天插 | 日韩黄网站| a级在线视频 |