Blazor 下支持 Azure AD 的多套登錄方案

比如上圖配置了兩套不同的登錄方案,各有自己的 TenantId?和 ClientId ,要同時支持他們的登錄(其實在同一套?TenantId?和 ClientId 里面配置多個登錄賬戶不就好了,但是......那套登錄的管理是在客戶自己的Azure AD賬戶管理下的,而作為技術支持不想麻煩客戶,更何況客戶不一定同意呢,所以需要第二套專為技術支持提供的用戶組......那么就自己再弄一套吧)

然后問題就來了,在Blazor 頁面要觸發驗證需要調用 HttpContext.ChallengeAsync,你可以試試在.razor 組件內調用?HttpContextAccessor.HttpContext.ChallengeAsync 會發生什么......
當你執行的時候,由于Blazor 使用的是 WebSocket 所以這個 Http 的處理方式就報錯了,說你的請求頭有問題,是不是很無語?

那么怎么解決這個問題呢?在Asp.net Core 3.0 就加入了 EndPoints 終結點的概念,看一下 ChatGPT 是怎么說的

由此看來?EndPoints 可以自定義的控制路由訪問,比Controller更加強大

所以這個時候搞明白一件事情,對于多個 oidc 的登錄,需要自己用一特定路由地址來實現

這個工作都在 StartUp 里完成,只列出核心代碼

1. 注冊兩套 OIDC 登錄方案,注意他們的?CallbackPath? 不能是一樣的

        public void ConfigureServices(IServiceCollection services){......services.AddRazorPages();services.AddServerSideBlazor();// Configure authenticationvar authorityFormat = Configuration["AzureAd:Authority"];var callbackPath = Configuration["AzureAd:CallbackPath"];services.AddAuthentication(options =>{options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;}).AddCookie().AddOpenIdConnect(_customerAuthType, options =>{options.Authority = string.Format(CultureInfo.InvariantCulture, authorityFormat, Configuration[$"AzureAd:{_customerAuthType}:TenantId"]);options.ClientId = Configuration[$"AzureAd:{_customerAuthType}:ClientId"];options.CallbackPath = Configuration[$"AzureAd:{_customerAuthType}:CallbackPath"];options.ResponseType = OpenIdConnectResponseType.IdToken; // Use implicit flowoptions.Scope.Add("openid");options.Scope.Add("profile");options.Events = new OpenIdConnectEvents{OnTokenValidated = context =>{var identity = context.Principal.Identity as ClaimsIdentity;identity.AddClaim(new Claim(_authScheme, _customerAuthType));return Task.CompletedTask;}};}).AddOpenIdConnect(_supportAgentAuthType, options =>{options.Authority = string.Format(CultureInfo.InvariantCulture, authorityFormat, Configuration[$"AzureAd:{_supportAgentAuthType}:TenantId"]);options.ClientId = Configuration[$"AzureAd:{_supportAgentAuthType}:ClientId"];                                options.CallbackPath = Configuration[$"AzureAd:{_supportAgentAuthType}:CallbackPath"];                options.ResponseType = OpenIdConnectResponseType.IdToken;options.Scope.Add("openid");options.Scope.Add("profile");options.Events = new OpenIdConnectEvents{OnTokenValidated = context =>{var identity = context.Principal.Identity as ClaimsIdentity;identity.AddClaim(new Claim(_authScheme, _supportAgentAuthType));return Task.CompletedTask;}};});services.AddAuthorization();......}

2. 使用?Endpoints 響應自己定義的路由處理 (登錄和登出)

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env){......app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();endpoints.MapBlazorHub();endpoints.MapFallbackToPage("/_Host");// Add endpoints for login challengesendpoints.MapGet("/login-customer", async context =>{await context.ChallengeAsync(_customerAuthType, new AuthenticationProperties{RedirectUri = "/"});});endpoints.MapGet("/login-support-agent", async context =>{await context.ChallengeAsync(_supportAgentAuthType, new AuthenticationProperties{RedirectUri = "/"});});// Add endpoint for logoutendpoints.MapGet("/logout", async context =>{var user = context.User;if (user.Identity.IsAuthenticated){var authSchemeClaim = user.FindFirst(_authScheme);if (authSchemeClaim != null){var authScheme = authSchemeClaim.Value;var tenant = user.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid")?.Value;await context.SignOutAsync(authScheme);// sign out from IDPif (tenant != null){// Construct the current full URL                                var currentUrl = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.PathBase}";context.Response.Redirect($"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout?post_logout_redirect_uri={currentUrl}");}}}await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);                    });});}

可以看到上面分別注冊了三個路由?/login-customer,/login-support-agent,/logout

一個給客戶登錄用,一個給技術支持登錄用,最后一個是登出,

這個時候再利用 HttpContext 去?Challenge 就不會報錯了,那么 blazor 頁面上所做就是跳轉到上面的路由地址就可以實現相應的登錄和登出了

    private void SupportAgentLogin(){navigation.NavigateTo("/login-support-agent", true);}private void Logout(){navigation.NavigateTo("/logout", true);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14159.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot3 解決NoResourceFoundException: No static resource favicon.ico.異常

SpringBoot3 解決NoResourceFoundException: No static resource favicon.ico.異常 spring boot3項目中瀏覽器中訪問報錯找不到favicon.ico,雖然不影響使用,用api工具也可以忽略這個異常,但是防止瀏覽器訪問時出現異常干擾日志,所…

oracle數據庫解析過高分析

解析非常高,通過時間模型可以看到解析占比非常高 解析大致可以分為硬解析( hard parse)、軟解析( soft parse)和軟軟解析( soft soft parse)。如,執行一條 SQL 的時候,如…

星型模型和雪花模型的區別

星型模型和雪花模型都是數據倉庫設計中常用的維度建模方法,它們之間的主要區別在于數據組織結構、數據冗余度、查詢效率、可擴展性和正規化程度等方面: 星型模型 結構特點:星型模型中,一個中心的事實表連接多個維度表&#xff0…

在電腦中,Apple Mobile Device Support程序是什么?

Apple Mobile Device Support 是一項關鍵的后臺服務,它為 Windows 用戶提供了與蘋果 iOS 設備(包括 iPhone、iPad 和 iPod)順暢互動的能力。這項服務的核心功能是為iTunes軟件提供必要的支持,使得用戶能夠將他們的移動設備與電腦連…

Google Find My Device:科技守護,安心無憂

在數字化的時代,我們的生活與各種智能設備緊密相連。而 Google Find My Device 便是一款為我們提供安心保障的實用工具。 一、Find My Decice Netword的定義 谷歌的Find My Device Netword旨在通過利用Android設備的眾包網絡的力量,幫助用戶安全的定位所…

HTML5 歷史、地理位置處理、全屏處理

目錄 歷史HistoryAPI地理位置處理GeolocationAPI全屏處理FullscreenAPIHistoryAPI window.history 對象 window.history 是瀏覽器提供的一個內置對象,它提供了對瀏覽器歷史記錄的訪問和操作能力。通過這個對象,開發者可以實現無刷新頁面跳轉、添加新的瀏覽歷史條目等,從而提…

STM32F4_HAL控制GPIO輸出——跑馬燈實驗

1、GPIO工作模式 1.1 端口輸入數據寄存器(IDR) 1.2 端口輸出數據寄存器(ODR) 1.3 端口置位/復位寄存器(BSRR) 為什么有了 ODR 寄存器,還要這個 BSRR 寄存器呢?我們先看看 BSRR 的寄…

23種設計模式(持續輸出中)

一.設計模式的作用 設計模式是軟件從業人員長期總結出來用于解決特定問題的通用性框架,它提高了代碼的可維護性、可擴展性、可讀性以及復用性。 二.設計模式 1.工廠模式 工廠模式提供了創建對象的接口,而無需制定創建對象的具體類,工廠類…

hive表在HDFS的每個文件的大小加大

配置參數: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

華為OD機試 - 剩余銀飾的重量(Java 2024 C卷 100分)

華為OD機試 2024C卷題庫瘋狂收錄中,刷題點這里 專欄導讀 本專欄收錄于《華為OD機試(JAVA)真題(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測試…

【Python】 如何對對象列表進行排序,有點意思

在Python中,我們經常需要對對象列表進行排序,這可以通過多種方式實現。當對象是一個自定義類實例時,排序通常基于對象的一個或多個屬性。Python提供了內置的sorted()函數和列表的sort()方法,它們都允許我們指定一個排序的關鍵字。…

iPhone徹底刪除的照片怎么恢復?專業技巧助您解憂

在使用iPhone的過程中,我們可能會因為誤操作或其他原因將一些重要的照片徹底刪除。然而,即使照片被徹底刪除,也并不意味著它們就永遠消失了,它們只是被打上了“可覆蓋的空間”的標簽。 在照片被新數據覆蓋之前,我們仍…

C語言學習【C控制語句:循環】

C語言學習【C控制語句:循環】 while循環 /* 根據用戶鍵入的整數求和 */#include "stdio.h"int main(void) {long num;long sum 0L; /* 把sum初始化為0 */int status;printf("Please enter an integer to be summed");printf(&quo…

基于微信小程序的校園捐贈系統的設計與實現

校園捐贈系統是一種便捷的平臺,為校園內的各種慈善活動提供支持和便利。通過該系統,學生、教職員工和校友可以方便地進行捐贈,并了解到相關的項目信息和捐助情況。本文將介紹一個基于Java后端和MySQL數據庫的校園捐贈系統的設計與實現。 技術…

Java日期Date和LocalDateTime的工具類

Date package com.qiangesoft.utils.date;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具類** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] CHINESE_WEEK_DAY new String[]{&q…

Excel 公式積累

1.獲取當前位置的左側單元格 引用當前單元格左側的第一個單元格:OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) ROW()返回當前單元格的行號,COLUMN()返回當前單元格的列號。 ADDRESS函數可以根據指定行號和列號獲得工作表中的某個單元格的地址。例如…

go全部版本下載目錄

linux安裝教程: Download and install - The Go Programming Language rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gzexport PATH$PATH:/usr/local/go/bin go version 全部版本下載目錄: All releases - Th…

鴻蒙本機通信

demo地址 https://github.com/MartinLi89/WanHarmony 目前只學到一部分,不正確的地方,還望大家指正,我會及時更新,謝謝,歡迎評論留言 線程內通信,線程間通信,進程間通信 本篇帖子中描述的比較寬…

快速開發 Chrome插件

什么是 Chrome 插件 Chrome 插件程序是一種用于增強 Google Chrome 瀏覽器功能的小型軟件應用程序。它們可以幫助用戶自定義瀏覽體驗、添加新功能、集成外部服務以及自動化任務等。擴展程序使用 HTML、CSS 和 JavaScript 編寫,利用 Chrome 提供的 API 來與瀏覽器及…

18.分布式監控zabbix-proxy

zabbix proxy 使用場景: 監控遠程區域設備監控本地網絡不穩定區域當 zabbix 監控上千設備時,使用它來減輕 server 的壓力簡化分布式監控的維護 環境規劃: zabbix-server:外網IP地址192.168.111.66 zabbix-proxy:外網IP地址192.168.111.11 內網IP地址…