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

基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

這篇具有很好參考價(jià)值的文章主要介紹了基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

背景

公司使用的阿里云作為公有云,每次員工入職或離職時(shí)同時(shí)需要維護(hù)兩套賬號(hào)(一套內(nèi)部賬號(hào),一套阿里云RAM賬號(hào)),為了讓用戶能夠使用內(nèi)部賬號(hào)能訪問(wèn)阿里云,所以決定對(duì)接阿里云的SSO
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

  • 主流程介紹
  1. 用戶訪問(wèn)阿里云
  2. 阿里云調(diào)轉(zhuǎn)至公司內(nèi)部的SSO(單點(diǎn)登錄)
  3. 公司內(nèi)部SSO讓用戶進(jìn)行登錄
  4. 認(rèn)證成功后跳轉(zhuǎn)至阿里云

阿里云SSO

官網(wǎng)介紹

https://help.aliyun.com/document_detail/93684.html

文檔解析

我相信不少人跟我一樣,在做需求前首先去研究他的文檔。結(jié)果看了一遍下來(lái)卻不知所云,如果你也有這樣的問(wèn)題,那么接下來(lái)我?guī)阋徊揭徊降慕馕觥?/p>

什么是SAML

由于阿里云的SSO采用的是SAML2.0協(xié)議,所以第一步你需要了解SAML是什么!
SAML鏈接:

https://help.sap.com/doc/saphelp_me150/15.0.3VERSIONFORSAPME/zh-CN/17/6d45fc91e84ef1bf0152f2b947dc35/content.htm?no_cache=true

IDP和SP

基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)
阿里云關(guān)于SSO的名詞解釋太多,由于篇幅原因,這里我只介紹IDP和SP這兩個(gè)比較重要的概念

  • IDP

身份提供商:
說(shuō)白了就是對(duì)接阿里云SSO的第三方提供的一個(gè)身份認(rèn)證的服務(wù)。這個(gè)服務(wù)你可以使用云廠商的IDP(花錢(qián)買(mǎi)),也可以自建企業(yè)本地IDP(必須支持SAML2.0協(xié)議),而我選擇后者(省錢(qián)才是王道)

  • SP

服務(wù)提供商:
概念阿里云已經(jīng)解釋的比較詳細(xì)了(然而用戶可能還是一臉蒙蔽),在我們這個(gè)場(chǎng)景中SP其實(shí)指的就是阿里云,如果你要對(duì)接華為的SSO的話,這個(gè)SP其實(shí)指的就是華為云(這么解釋的話你應(yīng)該就好理解了吧)

開(kāi)始對(duì)接

說(shuō)明:
阿里云SSO有「用戶SSO」和「角色SSO」兩種對(duì)接方式,我們選擇「用戶SSO」進(jìn)行對(duì)接
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)
在接下來(lái)的對(duì)接工作中,我想你應(yīng)該已經(jīng)知道,我們只需要基于SAML2.0來(lái)實(shí)現(xiàn)自己的IDP即可。由于公司內(nèi)部有基于OAUTH2實(shí)現(xiàn)的SSO,所以我要做的就是在這個(gè)SSO服務(wù)中嵌入IDP
,當(dāng)然你也可以單獨(dú)拉個(gè)服務(wù)出來(lái)實(shí)現(xiàn)IDP

開(kāi)始開(kāi)發(fā)

說(shuō)明:

  • 以下代碼使用golang實(shí)現(xiàn)
  • 使用 github.com/crewjam/saml來(lái)實(shí)現(xiàn)自建IDP
  • 微服務(wù)框架: https://ego.gocn.vip/
  • 開(kāi)發(fā)前,請(qǐng)先下載阿里云提供的元數(shù)據(jù)文件,后續(xù)代碼中會(huì)用到

基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

自建IDP

import (
	"crypto"
	"crypto/x509"
	"encoding/pem"
	"encoding/xml"
	"errors"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"strings"
	"sync"

	"github.com/crewjam/saml"
	"github.com/crewjam/saml/samlidp"
	"github.com/gotomicro/ego-component/egorm"
	oauth2dto "github.com/gotomicro/ego-component/eoauth2/storage/dto"
	"github.com/gotomicro/ego/core/econf"
	"go.uber.org/zap"
)

var (
    // 保證saml實(shí)例為單例
	once               sync.Once
	samlServerInstance *samlServer
)

type samlServer struct {
    // serviceProviders 存儲(chǔ)華為云,或者阿里云的SP實(shí)例
	serviceProviders     map[string]*saml.EntityDescriptor
	lock                 sync.Mutex
	// 自建IDP 實(shí)例
	idp                  *saml.IdentityProvider
	store                samlidp.Store
	// sp 名稱(chēng)列表
	serviceProviderNames []string
}

// GetSamlServerInstance 獲取SamlServer 實(shí)例(單例:懶漢)
func GetSamlServerInstance() *samlServer {
	// lazy init
	once.Do(func() {
	    // appHost 你的域名
	    // econf.GetString("domain"): 從配置文件中獲取
		appHost, err := url.Parse(econf.GetString("domain"))
		if err != nil {
			panic("get appHost fail:" + err.Error())
		}
		metadataURL := *appHost
		ssoUrl := *appHost
		logoutUrl := *appHost
		// 獲取IDP元數(shù)據(jù)信息路由
		metadataURL.Path = metadataURL.Path + "/sso/third/idpMetadata"
		// IDP認(rèn)證路由
		ssoUrl.Path = ssoUrl.Path + "/sso/third/saml"
		// IDP退出路由
		logoutUrl.Path = "/sso/logout"
		samlServerInstance = &samlServer{
			serviceProviders: map[string]*saml.EntityDescriptor{},
			idp: &saml.IdentityProvider{
				Key:         rsaPrivateKey()(), // IDP 提供的 rsa  私鑰
				Certificate: x509Cert()(),     // IDP 提供的 x509 證書(shū)
				MetadataURL: metadataURL,   // 獲取IDP元數(shù)據(jù)信息路由
				SSOURL:      ssoUrl,       // IDP認(rèn)證路由(登錄)
				LogoutURL:   logoutUrl,    // IDP退出路由
			},
			serviceProviderNames: []string{"aliyun"},
		}
		// 實(shí)例化SP實(shí)例并存儲(chǔ)
		samlServerInstance.storeServiceProvider()
		// 初始化SP
		err = samlServerInstance.initializeServiceProviders()
		if err != nil {
			panic("initializeServiceProviders  fail:" + err.Error())
		}
		samlServerInstance.idp.ServiceProviderProvider = samlServerInstance
	})
	return samlServerInstance
}

// IDPMetadata 生成基于 saml 2.0 的idp xml
// 后續(xù)會(huì)將該IDP xml 上傳至阿里云中。使阿里云信任該IDP
func (s *samlServer) IDPMetadata() ([]byte, error) {
	buf, err := xml.MarshalIndent(s.idp.Metadata(), "", "  ")
	if err != nil {
		invoker.Logger.Error("IDPMetadata-MarshalIndent", zap.Error(err))
		return nil, err
	}
	return buf, nil
}



// storeServiceProvider 根據(jù)SP提供的元數(shù)據(jù)文件,實(shí)例化SP實(shí)例并存儲(chǔ)至緩存
// 阿里云作為SP,會(huì)提供元數(shù)據(jù)信息文件,來(lái)讓你的IDP對(duì)阿里云作為SP進(jìn)行信任
// https://ram.console.aliyun.com/providers
func (s *samlServer) storeServiceProvider() {
	store := &samlidp.MemoryStore{}
	for _, samlName := range s.serviceProviderNames {
		metadata := saml.EntityDescriptor{}
		// 讀取從阿里云下載下來(lái)的元數(shù)據(jù)文件(建議線上環(huán)境,將該文件保存至k8s的Secret中)
		confKey := fmt.Sprintf("saml.%s_metadata_file", samlName)
		contentByte, err := util.ReadFile(econf.GetString(confKey))
		if err != nil {
			invoker.Logger.Error("storeServiceProvider-ReadFile", zap.Error(err), zap.Any("invalid samlName", samlName))
			continue
		}
		err = xml.Unmarshal(contentByte, &metadata)
		if err != nil {
			invoker.Logger.Error("storeServiceProvider-Unmarshal", zap.Error(err), zap.Any("invalid metadata", string(contentByte)))
			continue
		}
		spKey := fmt.Sprintf("/services/%s", samlName)
		err = store.Put(spKey, samlidp.Service{
			Name:     samlName,
			Metadata: metadata,
		})
		if err != nil {
			invoker.Logger.Error("storeServiceProvider-storePut", zap.Error(err))
			continue
		}
	}
	// 將SP實(shí)例存儲(chǔ)至內(nèi)存中
	s.store = store
}

// initializeServiceProviders: 初始化 sp
func (s *samlServer) initializeServiceProviders() error {
	serviceNames, err := s.store.List("/services/")
	if err != nil {
		return err
	}
	for _, serviceName := range serviceNames {
		service := samlidp.Service{}
		if err := s.store.Get(fmt.Sprintf("/services/%s", serviceName), &service); err != nil {
			return err
		}
		s.serviceProviders[service.Metadata.EntityID] = &service.Metadata
	}
	return nil
}

// rsaPrivateKey ras 私鑰
func rsaPrivateKey() func() crypto.PrivateKey {
	return func() crypto.PrivateKey {
	    // 該私鑰上線時(shí),你可以存儲(chǔ)在k8s的Sceret中,本地調(diào)試的話,就直接讀本地文件
		contentBytes, err := util.ReadFile(econf.GetString("saml.keyFile"))
		if err != nil {
			panic("parse saml.keyFile fail:" + err.Error())
		}
		b, _ := pem.Decode(contentBytes)
		if b == nil {
			panic("Decode saml.keyFile fail")
		}
		k, err := x509.ParsePKCS8PrivateKey(b.Bytes)
		if err != nil {
			panic("ParsePKCS8PrivateKey saml.keyFile fail:" + err.Error())
		}
		return k
	}
}

// x509Cert x509證書(shū)
func x509Cert() func() *x509.Certificate {
	return func() *x509.Certificate {
	   // 該證書(shū)上線時(shí),你可以存儲(chǔ)在k8s的Sceret中,本地調(diào)試的話,就直接讀本地文件
		contentBytes, err := util.ReadFile(econf.GetString("saml.crtFile"))
		if err != nil {
			panic("parse saml.crtFile fail:" + err.Error())
		}
		b, _ := pem.Decode(contentBytes)
		if b == nil {
			panic("Decode saml.crtFile fail:" + err.Error())
		}
		c, err := x509.ParseCertificate(b.Bytes)
		if err != nil {
			panic("ParseCertificate saml.crtFile fail:" + err.Error())
		}
		return c
	}
}

上傳IDP元數(shù)據(jù)文件至阿里云

此處的目的是建立阿里云對(duì)你的IDP的信任
到這里可能有人會(huì)問(wèn)了,企業(yè)IDP元數(shù)據(jù)我在哪獲取呢?

上述初始化代碼中有這樣一個(gè)方法

func (s *samlServer) IDPMetadata() ([]byte, error)

你可以調(diào)用該方法來(lái)獲取IDP元數(shù)據(jù)文件(再包一層HTTP來(lái)調(diào)用該方法:注意鑒權(quán))
你獲取的IDP元數(shù)據(jù)文件可能是這樣的:

基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

然后將該文件上傳至阿里云中,鏈接:https://ram.console.aliyun.com/providers
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)
注意:以上操作時(shí),請(qǐng)不要開(kāi)啟SSO,不然會(huì)影響現(xiàn)有用戶的登錄(因?yàn)榇藭r(shí)還沒(méi)有對(duì)接完成,只是建立了互信,IDP認(rèn)證的接口還沒(méi)開(kāi)發(fā))

開(kāi)發(fā)IDP認(rèn)證接口

說(shuō)明: 當(dāng)你訪問(wèn)阿里云時(shí)(開(kāi)啟阿里云SSO),阿里云會(huì)回調(diào)IDP的認(rèn)證接口,所以接下來(lái)的時(shí)間我們會(huì)去實(shí)現(xiàn)該接口
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

// HTTP Route 相關(guān)代碼省略

// HandlerSamlSSO 處理saml登錄
func (s *samlServer) HandlerSamlSSO(c *oacore.Context) {
	var (
		request = c.Request
		writer  = c.Writer
	)

	redirectLogin := func() {
		c.Redirect(302, genRedirectUrl(request))
	}
	// 生成IDP 的 request:更多細(xì)節(jié),可以翻看源碼
	req, err := saml.NewIdpAuthnRequest(s.idp, request)
	if err != nil {
		invoker.Logger.Error("HandlerSSO-NewIdpAuthnRequest", zap.Error(err))
		c.JSONE(-1, "獲取請(qǐng)求數(shù)據(jù)失敗:"+err.Error(), nil)
		return
	}
	// 校驗(yàn) IDP request 
	if err := req.Validate(); err != nil {
		invoker.Logger.Error("HandlerSSO-Validate", zap.Error(err))
		c.JSONE(-1, "校驗(yàn)請(qǐng)求數(shù)據(jù)失敗:"+err.Error(), nil)
		return
	}
	// 校驗(yàn)用戶是否登錄
	userByToken, err := c.GetCookieUser()
	if err != nil {
		invoker.Logger.Warn("HandlerSSO-GetUserByParentToken", zap.Error(err))
		// 沒(méi)有登錄的話,跳轉(zhuǎn)至內(nèi)部的SSO登錄頁(yè)面
		redirectLogin()
		return
	}
	// 構(gòu)建跳轉(zhuǎn)至SP的斷言信息
	samlSession, err := buildSession(userByToken)
	if err != nil {
		invoker.Logger.Error("HandlerSSO-buildSession", zap.Error(err))
		c.JSONE(-1, "獲取斷言信息失敗:"+err.Error(), nil)
		return
	}
	assertionMaker := s.idp.AssertionMaker
	if assertionMaker == nil {
		assertionMaker = saml.DefaultAssertionMaker{}
	}

	if err := assertionMaker.MakeAssertion(req, samlSession); err != nil {
		invoker.Logger.Error("HandlerSSO-MakeAssertion", zap.Error(err))
		c.JSONE(-1, "設(shè)置斷言失敗:"+err.Error(), nil)
		return
	}
	/*
		翻看此處的源碼:其實(shí)做了兩件事情
		1.將斷言信息寫(xiě)入表單
		2.提交表單(表單URL指向的是阿里云SSO)
		tmpl := template.Must(template.New("saml-post-form").Parse(`<html>` +
			`<form method="post" action="{{.URL}}" id="SAMLResponseForm">` +
			`<input type="hidden" name="SAMLResponse" value="{{.SAMLResponse}}" />` +
			`<input type="hidden" name="RelayState" value="{{.RelayState}}" />` +
			`<input id="SAMLSubmitButton" type="submit" value="Continue" />` +
			`</form>` +
			`<script>document.getElementById('SAMLSubmitButton').style.visibility='hidden';</script>` +
			`<script>document.getElementById('SAMLResponseForm').submit();</script>` +
			`</html>`))
	*/
	if err := req.WriteResponse(writer); err != nil {
		invoker.Logger.Error("HandlerSSO-WriteResponse", zap.Error(err))
		c.JSONE(-1, "write斷言失敗:"+err.Error(), nil)
		return
	}
}

// genRedirectUrl: 生成內(nèi)部SSO系統(tǒng)的認(rèn)證地址(跳轉(zhuǎn)至內(nèi)部系統(tǒng)的登錄頁(yè)面)
func genRedirectUrl(request *http.Request) string {
	var (
	    // oauth2 clientID: 配置文件中獲取
		clientID    = econf.GetString("saml.clientID")
		// 阿里云跳轉(zhuǎn)時(shí)攜帶的 SAMLRequest
		samlRequest = url.QueryEscape(request.URL.Query().Get("SAMLRequest"))
		// 阿里云跳轉(zhuǎn)時(shí)攜帶的 SAMLRequest
		relayState  = url.QueryEscape(request.URL.Query().Get("RelayState"))
	)
	
	redirectUrl := fmt.Sprintf("/sso/login?SAMLRequest=%s&RelayState=%s&redirect_uri=%s&client_id=%s&response_type=code",
		samlRequest, relayState, econf.GetString("domain")+"/sso/third/saml", clientID, source)
	return redirectUrl
}


// buildSession 構(gòu)造saml2.0斷言所需字段
func buildSession(user *oauth2dto.User) (*saml.Session, error) {
	var (
		sourceType uint8
	)
	// 校驗(yàn)是否給該員工開(kāi)啟了阿里云賬號(hào)(我們有后臺(tái)去維護(hù)員工的阿里云賬號(hào))
	userThirdOpen, err := mysql.UserThirdOpenX(invoker.Db, egorm.Conds{
		"uid":         user.Uid,
	})
	if err != nil {
		invoker.Logger.Error("buildSession-UserThirdOpenX", zap.Error(err))
		return nil, fmt.Errorf("獲取用戶第三放應(yīng)用信息失敗:%s", err.Error())
	}
	if userThirdOpen.ID <= 0 {
		return nil, errors.New("請(qǐng)聯(lián)系管理員同步第三方賬號(hào)")
	}
	// 通用斷言部分
	// NameID: 為員工的阿里云RAM賬號(hào)
	nameId := strings.TrimSpace(userThirdOpen.NameID)
	session := &saml.Session{
		NameID:    nameId,
		UserName:  user.Username,
		UserEmail: user.Email,
	}
	return session, nil
}

驗(yàn)證

說(shuō)明:到此開(kāi)發(fā)和配置已經(jīng)完成,接下來(lái)我們需要開(kāi)啟阿里云的SSO,然后驗(yàn)證整個(gè)流程

  • 開(kāi)啟SSO
    基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

  • 使用RAM賬號(hào)登錄
    基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)
基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)

阿里云會(huì)攜帶saml相關(guān)請(qǐng)求參數(shù)重定向至企業(yè)內(nèi)部的IDP登錄頁(yè),認(rèn)證成功后,會(huì)調(diào)用 func (s *samlServer) HandlerSamlSSO(c *oacore.Context)函數(shù)處理并跳轉(zhuǎn)至阿里云

總結(jié)

以上就是關(guān)于企業(yè)內(nèi)部SSO對(duì)接阿里云基于SAML2.0協(xié)議SSO的流程,如果解決你的問(wèn)題,煩請(qǐng)點(diǎn)個(gè)贊嘍!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-409447.html

到了這里,關(guān)于基于SAML 2.0對(duì)接阿里云的SSO(單點(diǎn)登錄)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 飛書(shū)-SSO單點(diǎn)登錄

    飛書(shū)-SSO單點(diǎn)登錄

    飛書(shū) sso 單點(diǎn)登錄 可以參考 飛書(shū)js-sdk Documentation - Feishu Open Platform 實(shí)現(xiàn)效果 核心代碼 注意: 核心代碼-封裝qrcode方法 在 .vue 中的使用注意點(diǎn) 1.隨時(shí)更新 currentTab[tab選中的值] 的值 2.首次二維碼的更新可能有異步問(wèn)題,需要借助 nextTick[鉤子] 部分核心代碼(vue2.0)

    2024年04月29日
    瀏覽(19)
  • 【單點(diǎn)登錄SSO認(rèn)證中心】

    【單點(diǎn)登錄SSO認(rèn)證中心】

    (2017-09-22更新)GitHub:https://github.com/sheefee/simple-sso 1、http無(wú)狀態(tài)協(xié)議 web應(yīng)用采用browser/server架構(gòu),http作為通信協(xié)議。http是無(wú)狀態(tài)協(xié)議,瀏覽器的每一次請(qǐng)求,服務(wù)器會(huì)獨(dú)立處理,不與之前或之后的請(qǐng)求產(chǎn)生關(guān)聯(lián),這個(gè)過(guò)程用下圖說(shuō)明,三次請(qǐng)求/響應(yīng)對(duì)之間沒(méi)有任何聯(lián)系 但這

    2024年02月13日
    瀏覽(24)
  • 八個(gè)開(kāi)源免費(fèi)單點(diǎn)登錄(SSO)系統(tǒng)

    八個(gè)開(kāi)源免費(fèi)單點(diǎn)登錄(SSO)系統(tǒng)

    使用SSO服務(wù)可以提高多系統(tǒng)使用的用戶體驗(yàn)和安全性,用戶不必記憶多個(gè)密碼、不必多次登錄浪費(fèi)時(shí)間。下面推薦一些市場(chǎng)上最好的開(kāi)源SSO系統(tǒng),可作為商業(yè)SSO替代。 單點(diǎn)登錄(SSO)是一個(gè)登錄服務(wù)層,通過(guò)一次登錄訪問(wèn)多個(gè)應(yīng)用。使用SSO服務(wù)可以提高多系統(tǒng)使用的用戶體驗(yàn)

    2024年02月04日
    瀏覽(21)
  • 【springboot+vue項(xiàng)目(十五)】基于Oauth2的SSO單點(diǎn)登錄(二)vue-element-admin框架改造整合Oauth2.0

    【springboot+vue項(xiàng)目(十五)】基于Oauth2的SSO單點(diǎn)登錄(二)vue-element-admin框架改造整合Oauth2.0

    Vue-element-admin 是一個(gè)基于 Vue.js 和 Element UI 的后臺(tái)管理系統(tǒng)框架,提供了豐富的組件和功能,可以幫助開(kāi)發(fā)者快速搭建現(xiàn)代化的后臺(tái)管理系統(tǒng)。 vue-element-admin/ ? |-- build/ ? ? ? ? ? ? ? ? ? ? ? ? ?# 構(gòu)建相關(guān)配置文件 ? | ? ?|-- build.js ? ? ? ? ? ? ? ? ? # 生產(chǎn)環(huán)境構(gòu)建腳本

    2024年02月20日
    瀏覽(29)
  • 【分布式技術(shù)專(zhuān)題】「單點(diǎn)登錄技術(shù)架構(gòu)」一文帶領(lǐng)你好好認(rèn)識(shí)以下Saml協(xié)議的運(yùn)作機(jī)制和流程模式

    【分布式技術(shù)專(zhuān)題】「單點(diǎn)登錄技術(shù)架構(gòu)」一文帶領(lǐng)你好好認(rèn)識(shí)以下Saml協(xié)議的運(yùn)作機(jī)制和流程模式

    傳統(tǒng)上,企業(yè)應(yīng)用程序在公司網(wǎng)絡(luò)中部署和運(yùn)行。為了獲取有關(guān)用戶的信息,如用戶配置文件和組信息,這些應(yīng)用程序中的許多都是為與公司目錄(如Microsoft Active Directory)集成而構(gòu)建的。更重要的是,通常使用目錄存儲(chǔ)和驗(yàn)證用戶的憑據(jù)。例如,如果您使用在本地運(yùn)行的Share

    2024年02月05日
    瀏覽(21)
  • Java實(shí)現(xiàn)單點(diǎn)登錄(SSO)詳解:從理論到實(shí)踐

    Java實(shí)現(xiàn)單點(diǎn)登錄(SSO)詳解:從理論到實(shí)踐

    ??謝謝大家捧場(chǎng),祝屏幕前的小伙伴們每天都有好運(yùn)相伴左右,一定要天天開(kāi)心哦!??? ????作者主頁(yè): 喔的嘛呀???? ?? 帥哥美女們,我們共同加油!一起進(jìn)步!??? 目錄 引言 一、什么是單點(diǎn)登錄(SSO)? 二、SSO的工作原理 三、SSO的具體實(shí)現(xiàn) SSO的核心概念

    2024年04月16日
    瀏覽(21)
  • SaaSpace:8款最好的免費(fèi)SSO單點(diǎn)登錄軟件工具

    我們確實(shí)花了很多時(shí)間用于登錄。 這不僅耗時(shí),而且往往是一種令人羞愧的經(jīng)歷。(例如,你經(jīng)常問(wèn)自己,“這個(gè)密碼中的\\\'B\\\'是大寫(xiě)還是小寫(xiě)?”,然后反思“我失去了記憶嗎?”) 根據(jù)一些報(bào)告的研究,單點(diǎn)登錄軟件為努力跟蹤其無(wú)數(shù)不同登錄次數(shù)(平均191次)的企業(yè)用

    2024年02月06日
    瀏覽(36)
  • Webfunny前端監(jiān)控如何接入飛書(shū)單點(diǎn)登錄(SSO)

    Webfunny前端監(jiān)控如何接入飛書(shū)單點(diǎn)登錄(SSO)

    Hello,大家好,歡迎使用** webfunny前端監(jiān)控和埋點(diǎn)平臺(tái) **。今天我們將介紹一下如何接入飛書(shū)的登錄系統(tǒng)。 友情提示:如果飛書(shū)側(cè)已經(jīng)配置好了,可以直接跳到第六步閱讀。 進(jìn)入飛書(shū)開(kāi)發(fā)者后臺(tái),創(chuàng)建企業(yè)自建應(yīng)用,命名「webfunny」(名字自己起哈) 應(yīng)用創(chuàng)建完成后,會(huì)生成

    2024年04月27日
    瀏覽(24)
  • 前端049_單點(diǎn)登錄SSO_封裝 Axios 與 Mock.js

    安裝 Axios ,來(lái)向后臺(tái)發(fā)送接口請(qǐng)求 安裝 Axios 發(fā)送接口請(qǐng)求 創(chuàng)建 src/utils/request.js

    2024年02月08日
    瀏覽(94)
  • AWS多賬戶單點(diǎn)登錄 IAM Identity Center(AWS SSO)

    AWS多賬戶單點(diǎn)登錄 IAM Identity Center(AWS SSO)

    需求場(chǎng)景 多個(gè)aws賬戶,登陸麻煩且不安全,SSO單點(diǎn)功能并且外部身份提供者 — 如果您要管理外部身份提供者(IdP)(例如 Okta 或 Active Directory)中的用戶。 官方文檔:https://docs.aws.amazon.com/zh_cn/singlesignon/latest/userguide/getting-started.html 最佳實(shí)踐:https://aws.amazon.com/cn/blogs/securi

    2024年02月12日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包