当前位置: 首页 > news >正文

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

目录:

  1. OpenID 与 OAuth2 基础知识
  2. Blazor wasm Google 登录
  3. Blazor wasm Gitee 码云登录
  4. Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务
  5. Blazor OIDC 单点登录授权实例2-登录信息组件wasm
  6. Blazor OIDC 单点登录授权实例3-服务端管理组件
  7. Blazor OIDC 单点登录授权实例4 - 部署服务端/独立WASM端授权
  8. Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp)端授权
  9. Blazor OIDC 单点登录授权实例6 - Winform 端授权
  10. Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权

(目录暂时不更新,跟随合集标题往下走)

源码

BlazorSSRAppOIDC

十分钟搞定单点登录

单点登录(SSO)简化了用户体验,使用户能够在访问多个应用时只需一次登录。这提高了用户满意度,减少了密码遗忘的风险,同时增强了安全性。但是,实现单点登录并不容易,需要应用程序实现和认证服务器的交互逻辑,增加了应用程序的开发工作量。例子中的安全策略中提供了 OpenID Connect (OIDC) 的能力,无需对应用做过多的修改,在十分钟内即可立刻实现单点登录。

当采用单点登录之后,用户只需要登录一次,就可以访问多个应用系统。SSO 通常由一个独立的身份管理系统来完成,该系统为每个用户分配一个全局唯一的标识,用户在登录时,只需要提供一次身份认证,就可以访问所有的应用系统。我们在使用一些网站时,经常会看到“使用微信登录”、“使用 Google 账户登录”等按钮,这些网站就是通过 SSO 来实现的。

采用单点登录有以下几个好处:

用户只需要登录一次,就可以访问多个应用系统,不需要为每个应用系统都单独登录。
应用系统不需要自己实现用户认证,只需将认证工作交给单点登录系统,可以大大减少应用系统的开发工作量。

使用 OIDC 单点登录, 可以简化客户端编写流程, 专注于功能实现而不用重复撰写登录部分功能代码, 也不用直接接触身份验证数据库, 剥离繁琐的重复劳动部分.

建立 net8 webapp ssr 工程

引用以下库

    <ItemGroup><PackageReference Include="BootstrapBlazor" Version="8.*" /><PackageReference Include="Densen.Extensions.BootstrapBlazor" Version="8.*" /><PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.*" /><PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="8.*" /><PackageReference Include="Microsoft.Extensions.Http" Version="8.*" /></ItemGroup>

_Imports.razor 加入引用

@using BootstrapBlazor.Components
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization

App.razor 加入必须的UI库引用代码

完整文件

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><base href="/" /><Link Href="_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css" /><Link Href="_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css" /><Link Href="_content/BootstrapBlazor/css/motronic.min.css" /><link rel="stylesheet" href="app.css" /><link rel="stylesheet" href="BlazorSSRAppOIDC.styles.css" /><HeadOutlet @rendermode="new InteractiveServerRenderMode(false)" />
</head><body><Routes @rendermode="new InteractiveServerRenderMode(false)" /><ReconnectorOutlet ReconnectInterval="5000" @rendermode="new InteractiveServerRenderMode(false)" /><Script Src="_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js"></Script><script src="_framework/blazor.web.js"></script>
</body></html>

Routes.razor 加入授权

完整代码

<Router AppAssembly="typeof(Program).Assembly"><Found Context="routeData"><AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)"><NotAuthorized><p role="alert">您无权访问该资源.</p></NotAuthorized><Authorizing><p>正在验证您的身份...</p></Authorizing></AuthorizeRouteView></Found>
</Router>

添加Oidc授权配置

新建 OidcProfile.cs 文件

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using System.Security.Claims;namespace OidcClientShared;public class OidcProfile
{ public static void OidcDIY(OpenIdConnectOptions options){var authority = "https://ids2.app1.es/"; //由于时间的关系,已经部署有一个实际站点, 大家也可以参考往期文章使用本机服务器测试//authority = "https://localhost:5001/"; var clientId = "Blazor5002";var callbackEndPoint = "http://localhost:5002";options.Authority = authority;options.ClientId = clientId;options.ResponseType = OpenIdConnectResponseType.Code;options.ResponseMode = OpenIdConnectResponseMode.Query;options.SignedOutRedirectUri = callbackEndPoint;options.CallbackPath = "/authentication/login-callback";options.SignedOutCallbackPath = "/authentication/logout-callback";options.Scope.Add("BlazorWasmIdentity.ServerAPI openid profile");options.GetClaimsFromUserInfoEndpoint = true;options.SaveTokens = true;options.MapInboundClaims = false;options.ClaimActions.MapAll();options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");options.ClaimActions.MapJsonKey(ClaimValueTypes.Email, "email", ClaimValueTypes.Email);options.ClaimActions.MapJsonKey(ClaimTypes.Role, "role");options.Events = new OpenIdConnectEvents{OnAccessDenied = context =>{context.HandleResponse();context.Response.Redirect("/");return Task.CompletedTask;},OnTokenValidated = context =>{var token = context.TokenEndpointResponse?.AccessToken;if (!string.IsNullOrEmpty(token)){if (context.Principal?.Identity != null){var identity = context.Principal!.Identity as ClaimsIdentity;identity!.AddClaim(new Claim("AccessToken", token)); }}return Task.CompletedTask;}};}}

Program.cs 加入授权相关

其中要加入Razor的cshtml支持, 因为登录要依靠管道跳转. 上下有两行都注释在文件内了.

完整代码

using BlazorSSRAppOIDC.Components;
using OidcClientShared;var builder = WebApplication.CreateBuilder(args);//在具有 Blazor Web 应用程序模板的 .NET 8 中,需要将其更改为, 由于该Pages文件夹已移至该Components文件夹中,因此您需要指定新位置的根目录,或将该Pages文件夹移回项目的根级别
builder.Services.AddRazorPages().WithRazorPagesRoot("/Components/Pages");
// Add services to the container.
builder.Services.AddRazorComponents().AddInteractiveServerComponents();builder.Services.AddCascadingAuthenticationState();
builder.Services.AddHttpClient();
builder.Services.AddDensenExtensions();
builder.Services.ConfigureJsonLocalizationOptions(op =>
{// 忽略文化信息丢失日志op.IgnoreLocalizerMissing = true;});builder.Services.AddAuthentication(options =>{options.DefaultScheme = "Cookies";options.DefaultChallengeScheme = "oidc";}).AddCookie("Cookies").AddOpenIdConnect("oidc", OidcProfile.OidcDIY); var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Error", createScopeForErrors: true);// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts();
}app.UseHttpsRedirection();app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
//但出于某种原因,这还不够。在 Blazor Web 应用程序模板中,您明确需要调用
app.MapRazorPages();app.MapRazorComponents<App>().AddInteractiveServerRenderMode();app.Run();

Pages 文件夹新建登录Razor页实现登录和注销跳转

展开 Login.cshtml 文件组合三角箭头, 编辑 Login.cshtml.cs

Login.cshtml.cs

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc.RazorPages;namespace PersonalToolKit.Server.Components.Pages;public class LoginModel : PageModel
{public async Task OnGet(string redirectUri){await HttpContext.ChallengeAsync("oidc", new AuthenticationProperties { RedirectUri = redirectUri });}}

Logout.cshtml.cs

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc.RazorPages;namespace PersonalToolKit.Server.Components.Pages;public class LogoutModel : PageModel
{public async Task OnGet(string redirectUri){await HttpContext.SignOutAsync("Cookies");await HttpContext.SignOutAsync("oidc", new AuthenticationProperties { RedirectUri = redirectUri });}}

Routes.razor 加入授权

完整代码

Home.razor

完整代码

@page "/"
@using System.Security.Claims
@inject NavigationManager Navigation<PageTitle>Home</PageTitle><AuthorizeView><Authorized>你好, @context.User.Identity?.Name (@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value)<Button Text="注销" OnClick="BeginLogOut" /><br /><br /><br /><h5>以下是用户的声明</h5><br />@foreach (var claim in context.User.Claims){<p>@claim.Type: @claim.Value</p>}</Authorized><NotAuthorized><Button Text="登录" OnClick="BeginLogIn" /><p>默认账号 test@test.com 密码 0</p></NotAuthorized></AuthorizeView>@code {private string LoginUrl = "login?redirectUri=";private void BeginLogIn(){var returnUrl = Uri.EscapeDataString(Navigation.Uri);Navigation.NavigateTo(LoginUrl + returnUrl, forceLoad: true);}private string LogoutUrl = "logout?redirectUri=";private void BeginLogOut(){var returnUrl = Uri.EscapeDataString(Navigation.Uri);Navigation.NavigateTo(LogoutUrl + returnUrl, forceLoad: true);}}

运行

相关文章:

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor OIDC 单点登录授权实例2-登录信息组件wasmBlazor OIDC 单点登录授权实例3-服务端管理组件Blazor OIDC 单点登录授权实例4 …...

基于蒙特卡洛的电力系统可靠性分析matlab仿真,对比EDNS和LOLP

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 1.课题概述 电力系统可靠性是指电力系统按可接受的质量标准和所需数量不间断地向电力用户供应电力和电能量的能力的量度&#xff0c;包括充裕度和安全性两个方面。发电系统可靠性是指统一并网的全部发电机…...

Spring boot整合redisson报错

Spring boot整合redisson报错 org.redisson.client.RedisConnectionException: Unable to connect to Redis server: localhost/127.0.0.1:6379 原因 原因是计算机连接不上redis导致的 解决方案 重启redis 在redis文件目录下打开cmd 1.检查redis是否在运行 redis-cli p…...

【AIGC】Stable Diffusion的ControlNet插件

ControlNet 介绍 ControlNet 插件是 Stable Diffusion 中的一个重要组件&#xff0c;用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能&#xff1a; 模型控制&#xff1a; ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…...

【蓝桥杯单片机入门记录】认识单片机

目录 单片机硬件平台 单片机的发展过程 单片机开发板 单片机基础知识 电平 数字电路中只有两种电平&#xff1a;高和低 二进制&#xff08;8421码&#xff09; 十六进制 二进制数的逻辑运算 “与” “或” “异或” 标准C与C51 如何学好单片机 端正学习的态度、培…...

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…...

用ESP8266快速实现WIFI红外遥控器(SoC模式)

1&#xff0c;硬件结构图 主要使用了esp8266 wifi模块和红外串口通讯模块。有了红外串口通讯模块&#xff0c;省去了单片机的串口通讯和红外编码程序&#xff0c;大大缩短开发时间。因为红外通讯模块不支持3.3VTTL电平&#xff0c;所以两个模块之间加了一个2路电平转换模块&…...

微服务OAuth 2.1认证授权可行性方案(Spring Security 6)

文章目录 一、背景二、微服务架构介绍三、认证服务器1. 数据库创建2. 新建模块3. 导入依赖和配置4. 安全认证配置类 四、认证服务器测试1. AUTHORIZATION_CODE&#xff08;授权码模式&#xff09;1. 获取授权码2. 获取JWT 2. CLIENT_CREDENTIALS(客户端凭证模式) 五、Gateway1.…...

Maui blazor ios 按设备类型设置是否启用safeArea

需求&#xff0c;新做了个app&#xff0c; 使用的是maui blazor技术&#xff0c;里面用了渐变背景&#xff0c;在默认启用SafeArea情况下&#xff0c;底部背景很突兀 由于现版本maui在SafeArea有点bug&#xff0c;官方教程的<ContentPage SafeAreafalse不生效&#xff0c;于…...

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …...

生活篇——华为手机去除负一屏

华为手机去除如下图的恶心负一屏 打开华为的应用市场app 进入&#xff1a;我的-设置-国家/地区&#xff08;改为俄罗斯&#xff09;-进入智慧助手检查更新并更新智慧助手。 然后重复开始的操作&#xff0c;将地区改回中国&#xff0c;这样就没有负一屏了。...

2024牛客寒假算法基础集训营2-c Tokitsukaze and Min-Max XOR

来源 题目 Tokitsukaze 有一个长度为 n 的序列 a1,a2,…,an和一个整数 k。 她想知道有多少种序列 b1,b2,…,bm满足&#xff1a; 其中 ⊕\oplus⊕ 为按位异或&#xff0c;具体参见 百度百科&#xff1a;异或 答案可能很大&#xff0c;请输出  mod1e97 后的结果。 输入描述…...

C语言:指针的基础详解

目录 1. 内存 2. 取地址& 3. 指针变量 4. 解引用 4.1 *解引用 4.2 []解引用 4.3 ->解引用 5. 指针变量的大小 5.1 结论 6. 指针运算 7. void* 指针 8. const修饰指针 8.1 const修饰变量 8.2 const修饰指针变量 8.3 结论 9. 野指针 9.1 为什么会出现野指…...

PHP+vue+mysql校园学生社团管理系统574cc

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 前台功能&#xff1a; 首页&#xff1a;展示社团信息和活动…...

VS Code中主程序C文件引用了另一个.h头文件,编译时报错找不到函数

目录 一、问题描述二、问题原因三、解决方法四、扩展五、通过CMake进行配置 一、问题描述 VS Code中主程序C文件引用了另一个.h头文件&#xff0c;编译时报错找不到函数 主程序 main.c #include <stdio.h> #include "sumaa.h"int main(int, char**){printf(&q…...

边缘计算:重塑数字世界的未来

引言 随着物联网&#xff08;IoT&#xff09;设备的激增和5G网络的普及&#xff0c;我们正站在一个计算模式的新纪元门槛上——边缘计算。这一技术范式将数据处理和分析推向网络的边缘&#xff0c;即设备或终端&#xff0c;为实时性要求较高的应用提供了前所未有的可能性。 目…...

2024 前端面试题 附录3

这里记录的是昨天和今天原篇的知识点补充 原篇地址&#xff1a; 2024 前端面试题&#xff08;GPT回答 示例代码 解释&#xff09;No.41 - No.60 2024 前端面试题&#xff08;GPT回答 示例代码 解释&#xff09;No.61 - No.100 2024 前端面试题&#xff08;GPT回答 示例代…...

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.——> Vue报错&#xff0c;key关键字不唯一&#xff1a; 解决办法&#xff1a;修改一下重复的id值&#xff01;&#xff01;&#xff01;...

Docker-Learn(二)保存、导入、使用Docker镜像

1.保存镜像 根据上一节内容&#xff0c;将创建好镜像进行保存&#xff0c;需要退出当前的已经在运行的docer命令行中断里面&#xff0c;可以通过在终端里面输入指令exit或者按下键盘上的 ctrlD建退出&#xff1a; 回到自己的终端里面&#xff0c;输入指令&#xff1a; docker…...

第三百一十五回

文章目录 1. 概念介绍2. 基本用法3. 补充用法4. 内容总结 我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容…...

保姆级教程:YOLOv8鹰眼目标检测镜像使用全流程解析

保姆级教程&#xff1a;YOLOv8鹰眼目标检测镜像使用全流程解析 1. 引言&#xff1a;为什么选择YOLOv8鹰眼目标检测&#xff1f; 在智能安防、工业质检、智慧零售等领域&#xff0c;高效准确的目标检测技术正发挥着越来越重要的作用。传统目标检测方案往往面临部署复杂、性能不…...

3分钟终极解决方案:快速解除Cursor试用限制的完整指南

3分钟终极解决方案&#xff1a;快速解除Cursor试用限制的完整指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We …...

K8s配置管理实战:如何优雅地通过ConfigMap挂载应用配置文件

1. ConfigMap基础&#xff1a;为什么它是Kubernetes配置管理的瑞士军刀 第一次接触Kubernetes时&#xff0c;我习惯性地把配置文件打包进Docker镜像&#xff0c;结果每次改配置都要重新构建镜像&#xff0c;CI/CD流水线跑得我怀疑人生。直到发现了ConfigMap这个神器&#xff0c…...

无需苹果硬件:用开源工具打造高效macOS虚拟机搭建方案

无需苹果硬件&#xff1a;用开源工具打造高效macOS虚拟机搭建方案 【免费下载链接】OneClick-macOS-Simple-KVM Tools to set up a easy, quick macOS VM in QEMU, accelerated by KVM. Works on Linux AND Windows. 项目地址: https://gitcode.com/gh_mirrors/on/OneClick-m…...

SDXL 1.0绘图工坊效果展示:多风格高清作品集,看看AI能画出多惊艳的图片

SDXL 1.0绘图工坊效果展示&#xff1a;多风格高清作品集&#xff0c;看看AI能画出多惊艳的图片 1. 开篇&#xff1a;当AI成为数字艺术家 想象一下&#xff0c;你只需要输入一段文字描述&#xff0c;就能在几秒钟内获得一张细节丰富、风格多样的高清图像——这不是科幻电影&am…...

5步实现消息永久可见:微信QQ防撤回设置完全指南

5步实现消息永久可见&#xff1a;微信QQ防撤回设置完全指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitH…...

Llama-3.2V-11B-cot参数详解:stream=True + max_new_tokens=512最佳实践

Llama-3.2V-11B-cot参数详解&#xff1a;streamTrue max_new_tokens512最佳实践 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡RTX 4090环境深度优化。该工具通过以下创新设计显著降低了多模态大模…...

革新性开源工具Win11Debloat:突破Windows 11性能瓶颈的系统优化方案

革新性开源工具Win11Debloat&#xff1a;突破Windows 11性能瓶颈的系统优化方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他…...

飞书机器人接入OpenClaw:Qwen3.5-4B-Claude模型对话触发方案

飞书机器人接入OpenClaw&#xff1a;Qwen3.5-4B-Claude模型对话触发方案 1. 为什么选择飞书OpenClaw的技术问答方案 去年团队内部开始频繁出现一个现象&#xff1a;每当新人遇到技术问题&#xff0c;总会在飞书群里反复老员工。简单的环境配置问题往往需要截图、录屏、文字描…...

在线客服系统源码 | 支持PC管理端+H5访客端+实时聊天

这是一个在线客服系统项目&#xff0c;包含三个主要部分&#xff1a;后端API服务器、PC端管理系统和H5端客服系统。以下是各部分的详细介绍&#xff1a; 1. 后端API服务器 主要功能&#xff1a;用户认证&#xff1a;管理员登录验证快捷回复管理&#xff1a;创建、读取、更新、删…...