界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

news2024/11/18 17:22:00

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。

本文中的内容概述了XAF跨平台.NET应用UI和DevExpress .NET App、Web API服务(预计发布日期:2024年6月)将发布的特性/功能。

在上文中(点击这里回顾>>),我们介绍了在下一个新版(v24.1)发布周期中ASP.NET Core Blazor UI的新特性、新功能等,本文将继续介绍安全方面的增强等。

注意:本文中列出的功能和特性说明官方当前/预计的发展计划,此信息仅供参考之用,其中列出的功能/产品可能会更改。

获取DevExpressv23.2正式版下载(Q技术交流:909157416)

安全增强
单点登录(SSO)支持

今天,现代XAF Blazor和WinForms应用程序与组织内部的许多外部系统集成在一起。例如,如果一个组织使用Microsoft 365, XAF应用程序通常可以在https://myapps.microsoft.com/上与该组织内的许多其他应用程序一起使用。由于XAF Blazor和WinForms .NET 6+应用程序(基于XPO和EF core)支持Microsoft Entra ID和其他OAuth2提供商,组织希望/更喜欢XAF应用程序与现有系统/服务(如Microsoft Entra单点登录(SSO))共享相同的登录详细信息或身份验证cookie。在v24.1中,XAF应用程序将本地支持SSO。

换句话说,组织需要满足以下要求:当用户已经在组织内进行身份验证时(例如,使用Microsoft 365), XAF应用程序必须与SSO无缝协作。目前XAF开发人员必须实现自定义解决方案来修改XAF的登录表单和身份验证行为以支持SSO,重要的单点登录场景包括但不限于以下场景:

  1. 如果用户没有在组织内登录,那么XAF应用程序将显示标准的OAuth2/SSO提供者登录表单(就像Teams, Word或Outlook通常为Microsoft 365所做的那样)。如果用户被管理员强制注销,那么XAF应用程序也应该显示标准的登录表单。
  2. 如果用户在组织内登录(它可以是另一个非XAF应用程序),则不会为用户显示XAF登录表单,焦点直接移动到XAF应用程序UI(通过来自组织的“应用程序仪表板”的链接或通过其他方法),XAF应用程序中的登录过程在后台自动进行(通过API调用)。在这种情况下,不应该强迫XAF用户显式地按下“Login with Microsoft”,因为SSO将按照预期“正常工作”。
  3. 如果组织内的用户在用户已经登录后需要进行额外的安全检查(例如,在30-60天后通过电话重新确认MFA信息),那么XAF应用程序必须提供一个清晰易懂的标准OAuth2提供者UI,并禁止XAF UI内的任何操作。例如,Teams、Word或Outlook会显示模态对话框来重新确认你的登录细节,然后用户才能再次访问和使用这些Microsoft 365应用程序。
支持ASP.NET Core身份和其他外部权限提供程序和存储

在v24.1中,您可以在XAF Blazor和WinForms应用中启用标准ASP.NET Core身份框架功能,这些应用由.NET 6+和实体框架核心提供支持。这包括Microsoft.AspNetCore.Identity.EntityFrameworkCore和数据库特定的身份包(如Microsoft.EntityFrameworkCore.SqlServer)的无缝集成。

如果您在XAF的解决方案向导中启用此选项,XAF项目将生成 `public class ApplicationUser : IdentityUser { /*... * /}`以及预配置的DbContext——两者都集成到XAF的安全系统中,用于身份验证和授权(基于角色的访问控制或RBAC)。XAF的RBAC(类型、记录和字段级权限)之间的链接是通过通用的IdentityRole和其他EF Core数据模型类(它们是Identity数据模型的一部分)建立的,这个Identity数据模型通过EF Core映射到底层数据库。

除了Identity模型和数据库存储之外,XAF客户还将体验到以下好处:

  • 自动访问所有标准身份特性,如单点登录(SSO)、注册新用户的端点、恢复密码和其他Microsoft实现(或未来的.NET实现)。
  • 特定于XAF的权限被序列化为JSON,并存储在与identityrole相关的表中。对于高级场景,XAF开发人员可以实现自定义权限提供程序,例如与外部服务而不是Identity数据库同步用户权限和角色(从技术上讲,您需要在XAF应用程序和外部端点之间传递JSON)。
  • XAF项目中的安全配置代码的数量也将被最小:

builder.Services.AddIdentityCore<ApplicationUser>() .AddEntityFrameworkStores<AppDbContext>() .AddApiEndpoints();

  • 如果您已经有了使用EF Core和Identity的外部项目,那么XAF的集成也会变得容易得多。在XAF驱动的项目中添加开发人员也会更容易,因为EF Core和ASP. NET Core Identity框架被数百万的.NET开发人员所使用。
  • XAF将继续为Identity用户和角色生成其标准的登录和CRUD UI屏幕,并允许您编辑XAF对这些角色的权限。
  • 您还可以在其他数据模型中引用ApplicationUser类(例如,实现CreatedBy或ModifiedBy属性)。标准标准函数,如CurrentUserId、IsUserInRole和其他函数也将起作用。

DevExpress XAF v24.1产品图集

WinForms应用的中间层安全:支持多租户和OAuth2

在v24.1中,具有中间层安全性的XAF WinForms应用程序(. NET 6+)将原生支持OAuth2提供者和多租户。

正如我们在安全注意事项文档中所描述的,使用中间层应用程序服务器,Windows桌面应用程序可以更好地满足企业安全标准。通过我们的解决方案,EF Core或XPO开发人员可以保留他们的标准DbContext或Session,并从任何.NET客户端(如XAF WinForms或非XAF应用程序)发起到数据存储的远程连接。此功能在某些环境/业务应用程序(由于安全考虑而无法维护直接数据库连接的环境)中至关重要。

强调一点:非AF EF Core或XPO开发人员可以从我们的中间层应用服务器中受益,并使用他们的实体数据模型保留DbContext或Session。这对许多桌面.NET开发人员(WinForms、WPF、WinUI等)来说尤其重要,因为他们现在需要满足更高的安全标准。简而言之,这些开发人员要么需要为Windows改造/现代化他们的“胖客户端”,要么需要使用现代Web技术和云服务从头开始。我们的中间层安全性允许您选择“更容易”且可能更可靠的路由,并使用中间件“替换”直接数据库连接。查看下面的代码片段以获得这方面的更多信息:

var httpRemoteRepository = new HttpRemoteRepository(httpClient, typeof(EFCoreDbContext).FullName);
var optionsBuilder = new DbContextOptionsBuilder<EFCoreDbContext>();
optionsBuilder.UseMiddleTier(opt =>
opt.UseRemoteRepository(httpRemoteRepository));
optionsBuilder.UseChangeTrackingProxies();
optionsBuilder.UseLazyLoadingProxies();
var dbContextOptions = optionsBuilder.Options;
var dbContext = new EFCoreDbContext(dbContextOptions);
var users = dbContext.Employees.ToList();
WinForms应用程序的中间层安全性:增强性能和可用性

具有中间层安全性的XAF WinForms将在v24.1中执行得更快。

此外,现在可以从BaseObject后代中调用新的SetPropertyValueWithBypassSecurity方法来绕过内部应用程序逻辑中某些受保护属性的安全检查(也支持自定义基类)。

当您希望设置CreatedBy、ModifiedBy、CreatedOn、UpdatedOn等服务属性时,这个功能对XAF开发人员尤其有价值——我们的Audit Trail和Model Difference模块使用类似的机制进行操作。SetPropertyValueWithBypassSecurity方法可以像应用程序管理员一样,在代码中代表受限制/普通用户自由地设置受保护的属性,而无需知道管理员凭据(如服务任务的模拟)。

public override void OnSaving() {
if (ObjectSpace.IsNewObject(this)) {
SetPropertyValueWithBypassSecurity(nameof(CreatedBy), GetCurrentUser());
}
else {
SetPropertyValueWithBypassSecurity(nameof(UpdatedBy), GetCurrentUser());
SetPropertyValueWithBypassSecurity(nameof(UpdatedOn), DateTime.Now);
}
if (!IsRunningOnMiddleTierServer()) {
// ...
}
}

对于许多XAFers来说,这是一个长期要求的选项—一个阻止从集成模式完全迁移到中间层安全的选项(因为CreateNonsecuredObjectSpace和其他解决方案不方便)。SetPropertyValueWithBypassSecurity也有一定的限制,比如调用这个方法只能从BaseObject.OnSaving内部支持(为了最好的安全性),或者被绕过的属性不能在内部更新其他受保护的属性,这个新选项可能将覆盖80%的流行用例。随着相关的性能增强,默认情况下在解决方案向导中启用XAF WinForms应用程序中的中间层安全性之前的最后一步,希望XAF开发人员能够发现这些新功能也足以切换到中间层安全性。

由于篇幅有限,下期继续讲解,请持续关注查看最新产品资讯哦~

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

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

相关文章

Toy 语言到 LLVM IR 实现源码注释

对从程序源代码到AST的转换部分做了注释 源码&#xff1a; toy.cpp #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Ver…

Java Day9 Stream流

Stream流 1、认识2、Stream流使用步骤3、如何获取Stream流4.Stream流的中间方法5、 Stream流终结方法 1、认识 2、Stream流使用步骤 3、如何获取Stream流 //list获取stream流List<String> listnew ArrayList<>();Collections.addAll(list,"崔十一","…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解

RCNN算法详解&#xff1a;【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列一&#xff1a;R-CNN图文详解 学习视频&#xff1a;Faster RCNN理论合集 Fast RCNN 概念辨析 1. RoI 在Fast R-CNN中&#xff0c;RoI&#xff08;Region of Interest&#xff0c;感兴…

Python导入类说一说

要在Python中导入一个类&#xff0c;需要使用import关键字。 详细去看下面的代码 1、多例类 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_type# self.stregth_leve…

Python网络基础爬虫-python基本语法

文章目录 逻辑语句if,else,elifforwhile异常处理 函数与类defpassclass 逻辑语句 熟悉C/C语言的人们可能很希望Python提供switch语句&#xff0c;但Python中并没有这个关键词&#xff0c;也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替&#xff0c;或者使用字…

解决JVM进程被系统杀掉问题

背景 服务A在测试环境&#xff0c;隔几个小时接口就无法访问。登录机器查看&#xff0c;发现进程已经没了。大致猜想是进程使用的内存或CPU资源使用太多&#xff0c;导致被系统kill。 问题定位 使用dmesg命令查看进程被kill的详情。 > dmesg --time-format iso2024-03-0…

【Python如何与电脑玩石头剪刀布游戏】

1、石头剪刀布Python代码如下&#xff1a; import random while True:a random.randint(0, 2)b int(input("请输入一个数字&#xff08;0石头, 1剪刀, 2布&#xff09;: "))c [石头, 剪刀, 布]if b ! 0 and b ! 1 and b ! 2:print("傻子&#xff0c;你出错了…

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…

S4 Hana SD -信贷管理 - 02

2.3 给信贷控制范围分配公司代码 TCODE: SPRO 配置路径:IMG > 企业结构 > 分配 > 财务会计 > 给信贷控制区分配公司代码 配置路径截图: 公司:被分配的公司代码。 公司名称&城市:已在公司代码数据中维护。 CCAR:分配的信贷控制范围。 覆盖CC范围:如…

InstantID Zero-shot Identity-Preserving Generation in Seconds

InstantID: Zero-shot Identity-Preserving Generation in Seconds TL; DR&#xff1a;InstantID IP-Adapter (Face) ControlNet&#xff0c;实现了具有较高保真度的人脸 ID 生成。 方法 InstantID 想做到的事情是&#xff1a;给定一张参考人脸 ID 图片&#xff0c;生成该…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…

利用Python进行网络爬虫:Beautiful Soup和Requests的应用【第131篇—Beautiful Soup】

利用Python进行网络爬虫&#xff1a;Beautiful Soup和Requests的应用 在网络数据变得日益丰富和重要的今天&#xff0c;网络爬虫成为了获取和分析数据的重要工具之一。Python作为一种强大而灵活的编程语言&#xff0c;在网络爬虫领域也拥有广泛的应用。本文将介绍如何使用Pyth…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

解决Git:Author identity unknown Please tell me who you are.

报错信息&#xff1a; 意思&#xff1a; 作者身份未知 ***请告诉我你是谁。 解决办法&#xff1a; git config --global user.name "你的名字"git config --global user.email "你的邮箱"

Android 15 首个开发者预览版到来

作者 / 工程副总裁 Dave Burke Android 15 的首个开发者预览版现已发布&#xff0c;以便各位开发者能与我们通力协作&#xff0c;打造更优秀的 Android 平台。 在 Android 15 中&#xff0c;我们继续致力于打造一个既能提升工作效率&#xff0c;又能提供全新功能的平台。这些新…

蓝桥杯-模拟-4402. 刷题统计

题目 思路 代码 a,b,nmap(int,input().split()) sa*5b*2 resn//s*7 # 存在周期 d[a,a,a,a,a,b,b] n%s i0 while n>0: # 对剩余数量进行枚举&#xff0c;如果等于0&#xff0c;相当于还会再进去加一天n-d[i]i1res1 print(res)

es 聚合操作(一)

前言 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何 使用…

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…

在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

目录 一、分布式寻址算法 1. hash 算法 2. 一致性 hash 算法 3. Redis cluster 的 hash slot 算法 二、Redis cluster 的高可用与主备切换原理 1. 判断节点宕机 2. 从节点过滤 3. 从节点选举 4. 与哨兵比较 一、分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash…

【代码随想录 | 链表 02】反转链表

文章目录 2.反转链表2.1题目2.2解法2.2.1双指针法2.2.2递归法 2.反转链表 2.1题目 206.反转链表——力扣链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例一&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;…