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.mzph.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 的时候,如…

Google Find My Device:科技守护,安心无忧

在数字化的时代,我们的生活与各种智能设备紧密相连。而 Google Find My Device 便是一款为我们提供安心保障的实用工具。 一、Find My Decice Netword的定义 谷歌的Find My Device Netword旨在通过利用Android设备的众包网络的力量,帮助用户安全的定位所…

STM32F4_HAL控制GPIO输出——跑马灯实验

1、GPIO工作模式 1.1 端口输入数据寄存器(IDR) 1.2 端口输出数据寄存器(ODR) 1.3 端口置位/复位寄存器(BSRR) 为什么有了 ODR 寄存器,还要这个 BSRR 寄存器呢?我们先看看 BSRR 的寄…

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架,它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口,而无需制定创建对象的具体类,工厂类…

华为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数据库的校园捐赠系统的设计与实现。 技术…

快速开发 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地址…

AI工具推荐:提升工作效率与生活质量

有哪些好用,且国内可用的AI工具? 副本 在AI大发展的年代,还有人在工作、生活中没有使用过AI吗? 今天为大家推荐几款国内可用、好用的AI工具,不论是自媒体文案写作、打工人汇报PPT、还是论文、公文写作,总…

设计系统采购与安装:乙级资质申请的技术准备

在设计系统采购与安装方面,为乙级资质申请所做的技术准备涉及多个方面。以下是一些关键的技术准备事项: 明确技术需求:首先,需要明确乙级资质申请所需的技术系统类型和规格。这可能包括但不限于设计软件、工程管理系统、项目管理系…

【Linux】之【Get√】查看linux CPU 架构 ---- amd64、x86、x86_64、arm64

关于Linux软件下载时:amd64、x86、x86_64、arm64 的说明 archuanme -alscpu

【设计模式深度剖析】【2】【创建型】【工厂方法模式】

👈️上一篇:单例模式 | 下一篇:抽象工厂模式👉️ 目录 工厂方法模式概览工厂方法模式的定义英文原话直译 工厂方法模式的4个角色抽象工厂(Creator)角色具体工厂(Concrete Creator)角色抽象产品&#x…

关于光照模型

关于光照模型 早期学习笔记,转载自早期Excel。 存在大量格式错误、可读性非常低,建议等待作者修复后阅读、或者作为查找性材料使用。 中文名英文名/缩写说明长什么样兰伯特光照模型Lambert Lighting1.兰伯特反射(Lambert)是最常见的一种漫反射&#x…

iptables防火墙【其二 实验篇】

保存&#xff0c;还原规则 防火墙规则的备份和还原 导出&#xff08;备份&#xff09;所有表的规则 iptables-save > /opt/ipt.txt 导入&#xff08;还原&#xff09;规则 iptables-restore < /opt/ipt.txt 将iptables规则文件保存在 /etc/sysconfig/iptables 中&#xf…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速&#xff0c;可以看我往期视频&#xff0c;这回改成yolov8bytetrack实现&#xff0c;实时性更好&#xff0c;原理和原来一样。车流量进出统计车速测量优点&#xff1a; 使用目标检测算法考虑bbox抖动&#xff0c;解…