Blazor SSR/WASM IDS/OIDC 单点登录授权实例5 - Winform 端授权

目录:

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

源码

WinFormsOIDC

建立winform项目

安装包 IdentityModel.OidcClient 以及 Microsoft.Web.WebView2 , 项目使用x64运行

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net8.0-windows</TargetFramework><Nullable>enable</Nullable><UseWindowsForms>true</UseWindowsForms><ImplicitUsings>enable</ImplicitUsings></PropertyGroup><ItemGroup><PackageReference Include="IdentityModel.OidcClient" Version="5.2.1" /><PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2210.55" /></ItemGroup></Project>

拖放一个TextBox控件

Form1.cs 代码

using IdentityModel.OidcClient;
using System.Text;
using WinFormsWebView2;namespace WinFormsOIDC;public partial class Form1 : Form
{static string authority = "https://localhost:5001/";//static string authority = "https://ids2.app1.es/"; //真实环境static string api = $"{authority}WeatherForecast";static string clientId = "Blazor5002";OidcClient _oidcClient;public Form1(){InitializeComponent();string redirectUri = string.Format($"http://localhost/authentication/login-callback");string redirectLogoutUri = string.Format($"http://localhost/authentication/logout-callback");var options = new OidcClientOptions{Authority = authority,ClientId = clientId,RedirectUri = redirectUri,PostLogoutRedirectUri = redirectLogoutUri,Scope = "BlazorWasmIdentity.ServerAPI openid profile",Browser = new WinFormsWebView()};_oidcClient = new OidcClient(options);Login();}private async void Login(){LoginResult loginResult;try{loginResult = await _oidcClient.LoginAsync();}catch (Exception exception){Output.Text = $"Unexpected Error: {exception.Message}";return;}if (loginResult.IsError){MessageBox.Show(this, loginResult.Error, "Login", MessageBoxButtons.OK, MessageBoxIcon.Error);}else{var sb = new StringBuilder(128);foreach (var claim in loginResult.User.Claims){sb.AppendLine($"{claim.Type}: {claim.Value}");}if (!string.IsNullOrWhiteSpace(loginResult.RefreshToken)){sb.AppendLine();sb.AppendLine($"refresh token: {loginResult.RefreshToken}");}if (!string.IsNullOrWhiteSpace(loginResult.IdentityToken)){sb.AppendLine();sb.AppendLine($"identity token: {loginResult.IdentityToken}");}if (!string.IsNullOrWhiteSpace(loginResult.AccessToken)){sb.AppendLine();sb.AppendLine($"access token: {loginResult.AccessToken}");}Output.Text = sb.ToString();}}
}

添加一个类 WinFormsWebView.cs

代码

using IdentityModel.OidcClient.Browser;
using Microsoft.Web.WebView2.WinForms;namespace WinFormsWebView2;public class WinFormsWebView : IBrowser
{private readonly Func<Form> _formFactory;private BrowserOptions? _options;public WinFormsWebView(Func<Form> formFactory){_formFactory = formFactory;}public WinFormsWebView(string title = "Authenticating ...", int width = 1024, int height = 768): this(() => new Form{Name = "WebAuthentication",Text = title,Width = width,Height = height}){ }public async Task<BrowserResult> InvokeAsync(BrowserOptions options, CancellationToken token = default){_options = options;using (var form = _formFactory.Invoke()){using (var webView = new WebView2(){Dock = DockStyle.Fill}){var signal = new SemaphoreSlim(0, 1);var browserResult = new BrowserResult{ResultType = BrowserResultType.UserCancel};form.FormClosed += (o, e) =>{signal.Release();};webView.NavigationStarting += (s, e) =>{if (IsBrowserNavigatingToRedirectUri(new Uri(e.Uri))){e.Cancel = true;browserResult = new BrowserResult(){ResultType = BrowserResultType.Success,Response = new Uri(e.Uri).AbsoluteUri};signal.Release();form.Close();}};try{form.Controls.Add(webView);webView.Show();form.Show();// Initializationawait webView.EnsureCoreWebView2Async(null);// 删除现有的 Cookie,这样以前的登录就不会被记住, 以免影响测试, 反之去掉这行,就可以保持登录//webView.CoreWebView2.CookieManager.DeleteAllCookies();// NavigatewebView.CoreWebView2.Navigate(_options.StartUrl);await signal.WaitAsync();}finally{form.Hide();webView.Hide();}return browserResult;}}}private bool IsBrowserNavigatingToRedirectUri(Uri uri){return uri.AbsoluteUri.StartsWith(_options?.EndUrl);}
}

Enjoy!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778807.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

js基础(1)

操作数组 数组.push() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.unshift() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.pop() 删除最后一个元素&#xff0c;返回该元素的值 更灵活的删除方法&#xff0c;删除指定元素 数组.spli…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度

实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度 线性结构&#xff1a; 数组&#xff1a;是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 查找数据 &#xff1a;随机访问 流程图 /** 查询元素下标…

【机器学习笔记】基于实例的学习

基于实例的学习 文章目录 基于实例的学习1 基本概念与最近邻方法2 K-近邻&#xff08;KNN&#xff09;3 距离加权 KNN4 基于实例/记忆的学习器5 局部加权回归5 多种回归方式对比6 懒惰学习与贪婪学习 ​ 动机&#xff1a;人们通过 记忆和行动来推理学习。 1 基本概念与最近邻方…

C++初阶之类与对象(中)——六个默认函数详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.构造函数 2.1构造函数的语法和特性 2.1.1语法 2.…

C++ dfs 的状态表示(五十一)【第十一篇】

今天我们接着学习dfs&#xff08;状态表示&#xff09;。 1.抽象形式的dfs 前面用到的 DFS 算法都是比较容易想象出搜索过程的&#xff0c;接下来我们看一些不那么容易想象搜索过程的 DFS 过程&#xff0c;这些问题我们称为抽象形式的 DFS。 来回顾一下上节课遇到的一个问题&a…

java 执行方式和类加载过程

java默认属于混合执行&#xff1a; 编译和解释并存 java先进行解释执行&#xff0c;遇到多次重复的代码会把它编程成可执行文件&#xff0c;方便下次直接执行。 可以通过VM参数来修改执行方式。 类加载过程

为什么IDM下载速度很慢,IDM下载速度很慢怎么办

为什么IDM下载速度很慢&#xff0c;IDM下载速度很慢怎么办 IDM采用的是多线程下载模式。 如果说单线程下载“一个人完成一项工作”&#xff0c;那多线程下载就是“多个人完成一项工作”。它能让用户从服务器获得更高的带宽&#xff0c;从而提高资源下载速度。一般IDM会默认使用…

MySQL篇----第十九篇

系列文章目录 文章目录 系列文章目录前言一、什么是存储过程?用什么来调用?二、如何通俗地理解三个范式?三、什么是基本表?什么是视图?四、试述视图的优点?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

【漏洞复现】狮子鱼CMS文件上传漏洞(image_upload.php)

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

postgresql 手动清理wal日志的101个坑

新年的第一天&#xff0c;总结下去年遇到的关于WAL日志清理的101个坑&#xff0c;以及如何相对安全地进行清理。前面是关于WAL日志堆积的原因分析&#xff0c;清理相关可以直接看第三部分。 首先说明&#xff0c;手动清理wal日志是一个高风险的操作&#xff0c;尤其对于带主从的…

70.SpringMVC怎么和AJAX相互调用的?

70.SpringMVC怎么和AJAX相互调用的&#xff1f; &#xff08;1&#xff09;加入Jackson.jar&#xff08;2&#xff09;在配置文件中配置json的消息转换器.(jackson不需要该配置HttpMessageConverter&#xff09; <!‐‐它就帮我们配置了默认json映射‐‐> <mvc:anno…

前端工程化面试题 | 04.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

禁止文件外发,文件禁止外发的方法

在当今的企业环境中&#xff0c;数据安全至关重要。 什么是企业文件外发&#xff1f; 企业文件外发指的是将企业内部的电子文件发送给组织外部的人员使用。 这种行为可能带来数据安全风险&#xff0c;因为电子文件自身具有易拷贝、易扩散、易传播的特性。 如果带有核心资产或…

AS自治系统的路由协议--BGP

BGPV4 --- IPV4 --- BGPV4 --- MPBGP --- 支持多种不同的地址组 重发布替代BGP的缺陷&#xff1a; 1&#xff0c;选路不佳 2&#xff0c;ASBR的归属问题 BGP --- 无类别路径矢量协议 1&#xff0c;无类别 --- 在传递路由信息的时候携带子网掩码 2&#xff0c;路径矢量 ---…

小游戏和GUI编程(4) | 基于 SFML 的黑客帝国字符雨

小游戏和GUI编程(4) | 基于 SFML 的黑客帝国字符雨 文章目录 小游戏和GUI编程(4) | 基于 SFML 的黑客帝国字符雨1. 简介2. 规划3. 一个字符的下落3. 一个雨滴的下落4. 每个雨滴都是独一无二的5. 重构后&#xff0c; 降落多个雨滴6. 总结7. 参考 1. 简介 使用 SFML 实现黑客帝国…

股价分布统计 100元能买股票吗?

A股的股价一般是多少&#xff1f;100元能买股票吗&#xff1f;能买多少&#xff1f; 一、买入交易规则&#xff1a; 沪深主板(包括中小板)&#xff0c;股票代码以600,000,002开头&#xff0c;每次最低买100股&#xff0c;随后以100股为单位增加&#xff0c;也就是可以买100股&…

k8s-资源限制与监控 15

资源限制 上传实验所需镜像 Kubernetes采用request和limit两种限制类型来对资源进行分配。 request(资源需求)&#xff1a;即运行Pod的节点必须满足运行Pod的最基本需求才能 运行Pod。 limit(资源限额)&#xff1a;即运行Pod期间&#xff0c;可能内存使用量会增加&#xff0…

委托和事件详解

委托和事件详解 前言一、委托1.什么是委托2.委托的声明3.Action<T>委托和Func<T>委托4.委托的缺点5.委托与lambda表达式6.委托的使用&#xff08;1&#xff09;模板方法&#xff08;2&#xff09;回调方法 二、事件1.什么是事件2.事件模型的5个步骤和组成部分&…

《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

文章目录 5.1 交互式暂存5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;为 Python 项目分阶段提交5.1.3 拓展案例 1&#xff1a;细粒度控制更改5.1.4 拓展案例 2&#xff1a;处理遗漏的更改 5.2 使用 Rebase 优化提交历史5.2.1 基础知识讲解5.2.2 重点案例&#xff1a;整理 Pyt…