.NET混合开发解决方案14 WebView2的基本身份验证

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

系列目录     【已更新最新开发文章,点击查看详细】

WebView2控件应用详解系列博客

.NET桌面程序集成Web网页开发的十种解决方案

.NET混合开发解决方案1 WebView2简介

.NET混合开发解决方案2 WebView2与Edge浏览器的区别

.NET混合开发解决方案3 WebView2的进程模型

.NET混合开发解决方案4 WebView2的线程模型

.NET混合开发解决方案5 WebView2运行时与分发应用

.NET混合开发解决方案6 检测是否已安装合适的WebView2运行时 
.NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件

.NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件

.NET混合开发解决方案9 WebView2控件的导航事件

.NET混合开发解决方案10 WebView2控件调用网页JS方法

.NET混合开发解决方案11 网页JS调用C#方法

.NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

.NET混合开发解决方案13 自定义WebView2中的上下文菜单

WebView2 应用的基本身份验证包括从 HTTP 服务器检索网页的一系列身份验证和导航步骤。 WebView2 控件充当主机应用和 HTTP 服务器之间通信的中介。

友情提醒:使用基本身份验证时必须使用 HTTPS。 否则,用户名和密码不加密。 您可能需要考虑其他形式的身份验证。 基本身份验证的 HTTP 标准包括未加密 (用户名和密码) 凭据。 因此,必须使用 HTTPS以确保凭据已加密。

导航事件的顺序
基本身份验证事件在事件序列的中间发生:

  1. NavigationStarting - 导航事件
  2. ContentLoading - 导航事件
  3. BasicAuthenticationRequested
  4. DOMContentLoaded
  5. NavigationCompleted - 导航事件

HTTP 服务器、WebView2 控件和主机应用之间的通信

  • HTTP 服务器检查身份验证 (用户名和密码凭据) 并返回错误文档或请求的网页。
  • WebView2 控件实例引发事件。 WebView2 控件位于 HTTP 服务器和主机应用之间。 WebView2 控件充当主机应用和 HTTP 服务器之间通信的中介。
  • 编写主机应用。 主机应用在响应对象中设置事件参数 () EventArgs 密码。

BasicAuthenticationRequestedEventArgs 具有 属性 Response 。 属性 Response 是包含用户名和密码属性的对象。

导航事件流程
下图显示了 WebView2 应用的基本身份验证的导航事件流:

  1. 主机应用指示 WebView2 控件导航到 URI。
  2. WebView2 控件与 HTTP 服务器通信,请求获取位于指定 URI 的文档。
  3. HTTP 服务器答复 WebView2 控件,指出"未经身份验证 (无法获取) URI"。
  4. WebView2 控件指示主机应用"需要身份验证" (BasicAuthenticationRequested事件) 。
  5. 主机应用通过向 WebView2 控件提供用户名和密码来响应该事件。
  6. WebView2 控件再次从 HTTP 服务器请求 URI,但这次使用的是身份验证 (用户名和密码) 。
  7. HTTP 服务器对用户名和密码 (凭据) 进行评估。
  8. HTTP 服务器可能会拒绝凭据并请求新的凭据。
  9. HTTP 服务器可能会拒绝用户名和密码;它可能会告诉 WebView2 控件"不允许获取该 URI/文档"。
  10. WebView2 控件呈现 HTTP 服务器返回的错误页。 呈现发生在ContentLoading 事件和 DOMContentLoaded 事件之间。
  11. HTTP 服务器可能会接受身份验证凭据并返回请求的文档。
  12. WebView2 控件呈现返回的文档。 呈现发生在 ContentLoading 事件和 DOMContentLoaded 事件之间。

示例程序

BasicAuthenticationRequeste事件中实现具体的校验凭证逻辑

 1 private void CoreWebView2\_BasicAuthenticationRequested(object? sender, CoreWebView2BasicAuthenticationRequestedEventArgs args)2 {3     /* 开发者需要异步显示UI,以便获得 CoreWebView2Deferral 对象。4  * 该对象将延迟 CoreWebView2 检查开发者在事件参数上设置的属性,直到稍后异步调用 Complete 方法。5  * 这给了开发者异步显示UI的时间。6      */7     CoreWebView2Deferral deferral = args.GetDeferral();8 9     // 通过在异步完成延迟后显示下载对话框,我们避免了在事件处理程序中运行消息循环的潜在可重入性
10     System.Threading.SynchronizationContext.Current.Post((\_) =>
11  {
12                                                              using (deferral)
13  {
14                                                                  // 提示最终用户进行身份验证时,重要的是向他们显示请求身份验证的URI或URI的来源,以便最终用户知道他们将用户名和密码提供给谁。
15 
16                                                                  // 向最终用户显示挑战也很重要,因为它可能会为最终用户提供重要的站点特定信息,以提供正确的用户名和密码
17 
18                                                                  // 使用应用程序或UI框架方法从最终用户获取输入。
19 
20                                                                  bool userNameAndPasswordSet = false;
21                                                                  Frm6Auth frm = new Frm6Auth(args.Uri);
22                                                                  DialogResult dialogResult = frm.ShowDialog();
23                                                                  if (dialogResult == DialogResult.OK)
24  {
25                                                                      args.Response.UserName = frm.UserName;
26                                                                      args.Response.Password = frm.UserPwd;
27                                                                      userNameAndPasswordSet = true;
28  }
29 
30                                                                  /* TODO 此处要做真正的认证校验。测试程序只做举例说明 */
31                                                                  if (args.Response.UserName != "admin" && args.Response.Password != "admin123456")
32  {
33                                                                      MessageBox.Show("用户名与密码不正确。", "提示",
34  MessageBoxButtons.RetryCancel,
35  MessageBoxIcon.Warning);
36 
37                                                                      userNameAndPasswordSet = false;
38  }
39 
40                                                                  // 如果我们没有从最终用户那里获得用户名和密码。我们取消认证请求,不提供任何认证
41                                                                  if (!userNameAndPasswordSet)
42  {
43                                                                      args.Cancel = true;
44  }
45  }
46                                                          }, null);
47 }

Frm6Auth窗体如下

基本身份验证的导航

有两种类型的导航:

  • "服务器请求的身份验证"导航。
  • "服务器为 WebView2 控件提供文档"导航。

第一种类型的导航后,服务器要求进行身份验证,并且应用需要再次尝试这种导航 (使用新的导航 ID) 。 新导航将使用主机应用从事件参数响应对象获取的任何内容。

HTTP 服务器可能需要 HTTP 身份验证。 在这种情况下,存在第一 个导航,该导航具有上面列出的导航事件。 HTTP 服务器返回 401 或 407 HTTP 响应 NavigationCompleted ,因此事件具有相应的失败。 然后,WebView2 呈现空白页 BasicAuthenticationRequested 并引发事件,这可能会提示用户输入凭据。

  • BasicAuthenticationRequested如果取消该事件,则没有后续导航,并且 WebView2 将保留以显示空白页。
  • BasicAuthenticationRequested如果未取消该事件,WebView2 将再次执行初始导航,但这次使用任何提供的凭据。 你将再次看到与之前相同的导航事件。

如果 HTTP 服务器不接受凭据,导航将再次因 401 或 407 失败。 在这种情况下,类 CoreWebView2 实例将再次引发 BasicAuthenticationRequested 事件,并且导航将继续,如上所述。

如果 HTTP 服务器接受凭据,则导航成功。 如果 HTTP 服务器拒绝身份验证,则 (通常返回错误页) 。

事件之前和之后导航 BasicAuthenticationRequested 是不同的导航,并且具有不同的导航 ID。导航event args有一个属性:NavigationId 与 NavigationId 单个导航对应的导航事件紧密结合。 在每个 NavigationId 导航过程中保持不变,如重试。 在下次传递事件流期间,使用不同的 NavigationId 方法。

系列目录     【已更新最新开发文章,点击查看详细】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse10破解详细说明

MyEclipse10破解详细教程 1.先安装好jdk,再安装好myeclipse10,并关闭该软件(jdk下载安装教程 http://blog.csdn.net/qq_36330228/article/details/75268398) 2.下载破解工具,打开me_active.jar 3.输入任意用户名,点击Systemid按…

中国电子云数据库 Mesh 项目 DBPack 的实践

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

(百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏

使用方法: 1、假设原始gps数据为(73.528888,39.368888) 2、查询数据库:SELECT * FROM offset where lng73.52 and lat39.36,得出offsetlat、offsetlng 3、用原始的lat加上offsetlat,lng加上offs…

国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(中)

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

(数据科学学习手札136)Python中基于joblib实现极简并行计算加速

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

date数据要在前台显示

date数据要在前台显示,如果要截取一部分使用,最好用SimpleDateFormat不要用toString不牢靠。 转载于:https://www.cnblogs.com/king12345678/archive/2012/12/07/2807604.html

被迫开始学习Typescript —— class

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

ASP.NET实现二维码(QRCode)的创建和读取

一、项目引用QRCode的DLL文件&#xff08;ThoughtWorks.QRCode.dll&#xff09; 二、ASPX页面&#xff08;两个jquery的js文件请自行去官网下载&#xff09;&#xff1a;[html] <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"…

杨玉基:知识图谱在美团推荐场景中的应用

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

Redis进阶知识一览

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

UI代码练习-视图的层次关系

2019独角兽企业重金招聘Python工程师标准>>> // // AppDelegate.h // 视图的层次关系 // // Created by on 14-12-17. // Copyright (c) 2014年 apple. All rights reserved. //#import <UIKit/UIKit.h> #import <CoreData/CoreData.h>interface Ap…

arthas学习图文记录

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

利用矩阵的n次方求图的连通性

设A&#xff08;n x n&#xff09;为一个图的邻接矩阵&#xff0c;则a(i,j)表示两个点之间是否连通&#xff08;1&#xff1a;连通&#xff0c;0&#xff1a;不连通&#xff09;。那么A的k次方中的每一个a&#xff08;i&#xff0c;j&#xff09;表示点i和j之间长度为k的路的条…

使用HBuilder新建项目

依次点击文件→新建→选择Web项目(按下CtrlN,W可以触发快速新建(MacOS请使用CommandN,然后左键点击Web项目)) 如上图&#xff0c;请在A处填写新建项目的名称&#xff0c;B处填写(或选择)项目保存路径(更改此路径HBuilder会记录&#xff0c;下次默认使用更改后的路径)&#xff0…

iOS应用开发视频教程笔记(二)My First iOS App

这课主要是以一个计算器一个用为例子&#xff0c;教你怎么使用XCode&#xff0c;如何使用MVC设计模式创建应用。 (1)新建一个single view application模版的应用 打开xcode并点击“创建一个新xcode项目”&#xff0c;进入项目创建界面&#xff0c;这个界面让我们为应用选择一个…

牛顿迭代法(Newton#39;s Method)

牛顿迭代法&#xff08;简称牛顿法&#xff09;由英国著名的数学家牛顿爵士最早提出。可是&#xff0c;这一方法在牛顿生前并未公开发表&#xff08;讨厌的数学家们还是鼓捣出来了&#xff09;牛顿法的作用是使用迭代的方法来求解函数方程的根。简单地说&#xff0c;牛顿法就是…

【深入理解计算机系统CSAPP】第六章 存储器层次结构

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

【转】无刷新验证用户名可用性

在用户注册时&#xff0c;我们经常需要检查用户名是否存在&#xff0c;本文就是实现无刷新验证用户名 打开开发环境VS 2005,新建项目(或打开现有项目),新建一个Web窗体,命名为 Default.aspx 代码如下&#xff1a; View Code <% Page Language"C#" AutoEventWireu…

Python数据分析--Numpy常用函数介绍(2)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)

&#xff08;其实今天好热啊&#xff1f; 题目大意&#xff1a;插入&#xff0c;删除&#xff0c;k小&#xff0c;前驱后继&#xff0c;数的排名。 splay和treap裸题...过几天补个treap的 splay: #include<iostream> #include<cstdlib> #include<cstring> #i…