【实战 Ids4】小技巧篇:自定义登录页操作

今天的内容很简单,1分钟就能看完,5分钟就能学会,但是却是在我们平时开发中必须要学会的一个小知识点,我就不让大家走弯路了,直接看操作。

在平时的IdentityServer4开发中呢,我们都是根据官方的Demo来操作一遍,或者是根据那个快速启动页面跑一跑,也就没有做其他的扩展,本文说的是登录,大家肯定认为这个是最简单的了,直接跳转,然后提交表单即可,但是就在要睡觉的时候,我想到了QQ或者其他登录页都是有一个oauth的字样,看着很专业的样子????,我也想换掉,目前的太程序员化了,说干就干,坐起来打开了电脑,需求如下:

目前的登录地址是:
https://ids.neters.club/Account/Login?ReturnUrl=%2Fgrants
我想要换成这样的效果:

https://ids.neters.club/oauth2/authorize?ReturnUrl=%2Fgrants

如果说你已经会了呢,可以不用看了;

如果说自己想先动手实践一下,先关掉本文窗口;

如果两者都不是,就跟着我往下走吧,很简单。

自定义登录页样式

这个其实不是本文的内容,但是和登录页有关系,我还是说一下吧,登录页的自定义样式很简单,甚至整个页面的布局也可以改变,别说css文件了,就是很普通的MVC操作,甚至也可以搞成前后端分离的形式,你没有听错,就是用前后端分离来设计Ids4认证中心项目。

不过这个感觉不是很有必要,还是把精力放到业务上吧,我这里简单的做了下样式处理,可以和原版的坐下对比:

(官方默认版本)

(我自定义模板样式)

(群内网友的项目,挺好)

为什么要说这个呢,是因为我们既然要做统一的授权认证中心,一个好看的登录页是很有必要的,毕竟以后很多个项目都要共用这一个,安全是第一位,美貌也不能丢,我的审美就不行,等春节在家优化优化。

自定义登录路由

刚刚我们说完了登录样式,那就到了重头戏,自定义登录路由地址,官方给我们的地址是:

/Account/Login

这个看着也真的有点儿硬了,而且我看很多的公司认证项目都是自定义的,那路径肯定我们也要修改修改,翻看了下官方资料,发现很简单,还记得我们上一篇说到的自定义跳转域名么,本来是localhost,后来我们配置了ids.neters.club,没错,还是那个地方:

  services.AddIdentityServer(options =>{options.Events.RaiseErrorEvents = true;options.Events.RaiseInformationEvents = true;options.Events.RaiseFailureEvents = true;options.Events.RaiseSuccessEvents = true;options.IssuerUri = "https://ids.neters.club";options.PublicOrigin = "https://ids.neters.club";// 就是这里,自定义用户交互选项         options.UserInteraction = new UserInteractionOptions{LoginUrl = "/oauth2/authorize",//登录地址  LogoutUrl = "/Account/Logout",//退出地址 ConsentUrl = "/Account/Consent",//允许授权同意页面地址ErrorUrl = "/Account/Error", //错误页面地址LoginReturnUrlParameter = "ReturnUrl",//设置传递给登录页面的返回URL参数的名称。默认为returnUrl LogoutIdParameter = "logoutId", //设置传递给注销页面的注销消息ID参数的名称。缺省为logoutId ConsentReturnUrlParameter = "ReturnUrl", //设置传递给同意页面的返回URL参数的名称。默认为returnUrlErrorIdParameter = "errorId", //设置传递给错误页面的错误消息ID参数的名称。缺省为errorIdCustomRedirectReturnUrlParameter = "ReturnUrl", //设置从授权端点传递给自定义重定向的返回URL参数的名称。默认为returnUrl                   CookieMessageThreshold = 5 //由于浏览器对Cookie的大小有限制,设置Cookies数量的限制,有效的保证了浏览器打开多个选项卡,一旦超出了Cookies限制就会清除以前的Cookies值};})

这里的配置是没有走数据库的,只有config.cs里的会配置到数据,从这里我们可以看出他们的一贯套路,就是走配置,不过如果不了解,配置多了就会乱,这不,说来就来了:

用这种办法,在InMemory模式下很正常,我使用是内存模式的,然后也跳转到了指定的登陆页面:oauth2/authorize,欣喜雀跃,替换到我的正式项目,不!!行!!。

然后看官网也没错呀,大约时间过去了十多分钟,我想到了一个问题。

修改Identity应用配置

这个是个小知识点,如果你对Aspnet core的Identity不熟悉的话,可能不会来得及考虑这个问题,因为我的项目是用的Identity来处理应用数据这一块的,如果你公司的项目是自定义的话,那就不用考虑这个问题了,我也打算在公司尝试使用自定义仓储的模式,替换掉微软官方推荐的Identity类来操作用户应用数据。

直接修改代码吧:

services.ConfigureApplicationCookie(options =>
{options.AccessDeniedPath = new PathString("/Account/AccessDenied");options.Cookie.Name = "Cookie";options.Cookie.HttpOnly = true;options.ExpireTimeSpan = TimeSpan.FromMinutes(720);options.LoginPath = new PathString("/oauth2/authorize");options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;options.SlidingExpiration = true;
});

具体的每一个啥意思,从字面意思上我们也能看的出来,我这里只用到了LoginPath这一个属性操作,这下应该没有问题了吧。

添加新控制器

既然我们新设计了登录页,那我们就必须创建一个新的控制器OAuth2Controller,当然你可以直接修改下原来的AccountController进行重命名,我采用的还是新增,现在开发基本都是对内修改禁止的思路,不过我新增这个也不能直接粘贴复制,要重构封装,还需要进一步优化中,优化这一块以后就不写到文章了,这里一笔带过了:

public class Oauth2Controller : Controller
{private readonly UserManager<ApplicationUser> _userManager;private readonly RoleManager<ApplicationRole> _roleManager;private readonly SignInManager<ApplicationUser> _signInManager;private readonly IIdentityServerInteractionService _interaction;private readonly IClientStore _clientStore;private readonly IAuthenticationSchemeProvider _schemeProvider;private readonly IEventService _events;public Oauth2Controller(UserManager<ApplicationUser> userManager,RoleManager<ApplicationRole> roleManager,SignInManager<ApplicationUser> signInManager,IIdentityServerInteractionService interaction,IClientStore clientStore,IAuthenticationSchemeProvider schemeProvider,IEventService events){_userManager = userManager;_roleManager = roleManager;_signInManager = signInManager;_interaction = interaction;_clientStore = clientStore;_schemeProvider = schemeProvider;_events = events;}/// <summary>/// Show login page/// </summary>[HttpGet]public async Task<IActionResult> authorize(string returnUrl){// build a model so we know what to show on the login pagevar vm = await BuildLoginViewModelAsync(returnUrl);if (vm.IsExternalLoginOnly){// we only have one option for logging in and it's an external providerreturn await ExternalLogin(vm.ExternalLoginScheme, returnUrl);}return View(vm);}
}

具体的和之前的是一样的,只不过拷贝过去了而已,这里不多说,发布查看效果吧。

打包发布

修改了上面三个小地方以后,我们提交我们的代码,最终实现了目的,登录页跳转看着专业了一丢丢:

打完手工,其实说白了,整篇文章就是一个小技巧,看看就明白了,但是这里要说一下,修改完以后,一定要多多的做测试,联调,或者让群里小伙伴一起检验。

最后还是要说一下,如果你有前后端分离的开源项目,可以联系我,我帮你推荐一下,然后让更多的人都能学到,看到,了解到你。


???? 点击阅读原文,查看Admin效果

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

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

相关文章

Asp.Net Core下的开源任务调度平台ScheduleMaster

从何说起2017年初的时候&#xff0c;由于当时项目需要做了一个乞丐版定时调度系统&#xff0c;那时候只在单机上实现了核心的调度功能。做这个玩意之前也调研了社区中开源的解决方案&#xff0c;找了几个实地部署试跑了一下&#xff0c;其实都很不错。但那时候我们有个问题就是…

C#录制视频

这是一个使用C#语言制作的录制框架&#xff0c;支持录制桌面&#xff0c;多屏&#xff0c;声音&#xff0c;摄像头&#xff0c;某个应用程序的界面1.安装使用此框架需要安装扩展包Kogel.Record,可以Nuget上搜索或者使用Nuget命令Install-Package Kogel.Record安装完成包后会出现…

python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区

用Python3编程第一步&#xff01;今天博主跟大家聊一聊如何使用Python3编程第一步&#xff01;&#xff01;不喜勿喷&#xff0c;如有建议欢迎补充、讨论&#xff01;Come on&#xff01;在前面的几篇文章中我们已经学习了一些Python3 的基本语法知识&#xff0c;我们尝试来写一…

UnitTest in .NET(Part 5)

Photo &#xff1a;UnitTesting文 | Edison Zhou上一篇我们学习了单元测试的核心技术&#xff1a;存根、模拟对象和隔离框架&#xff0c;它们是我们进行高质量单元测试的技术基础。本篇会集中在管理和组织单元测试的技术&#xff0c;以及如何确保在真实项目中进行高质量的单元测…

java 大小写_java中如何进行大小写字母转换?

展开全部1.创建工程&#xff0c;或使用已有工程&#xff0c;在工程下创建包&#xff0c;包内新建一个类&#xff0c;我e69da5e887aa3231313335323631343130323136353331333365653262命名为Cases类&#xff0c;大家根据自己喜好随便命名&#xff0c;但请保持类名与文件名一致。2…

大量SQL的解决方案——sdmap

大量SQL的解决方案——sdmap最近看到群里面经常讨论大型应用中 SQL的管理办法&#xff0c;有人说用 EF/ EFCore&#xff0c;但很多人不信任它生成 SQL的语句&#xff1b;有人说用 Dapper&#xff0c;但将 SQL写到代码中有些人觉得不合适&#xff1b;有人提出用存储过程&#xf…

java 最小堆_堆排序 最大堆 最小堆 Java 实现

堆一点疑惑&#xff0c;堆排序是就地排序&#xff0c;所以空间复杂度是 O(1)。但是&#xff0c;比如我有一个数组&#xff0c;建立一个最小堆&#xff0c;然后每次取出最小堆的顶点。建立最小堆需要额外空间&#xff1f;不深究了&#xff0c;归并排序需要额外空间。堆是完全二叉…

提高文档翻译效率神器:VS Code 插件之 Translator Helper

微软 Docs 网站上线之后&#xff0c;我发现很多中文内容是由机器翻译的&#xff0c;可读性比较差。2017 年开始我参与了中文文档的本地化工作&#xff0c;对机器翻译的文本进行校对。Docs 的内容全部托管在 GitHub 上&#xff0c;参与者可以 fork 仓库后进行修改&#xff0c;然…

java 导入导出 插件_Java最优的Excel导入/导出工具开发,你用过吗?

关注程序员7歌&#xff0c;一起用技术改变世界在我们实际开发中经常会遇到Excel的导入与导出功能&#xff0c;而目前Excel操作工具也是数不甚数啊&#xff0c;但是7歌用过很多&#xff0c;还是觉得最近发现的tool-excel好用&#xff0c;让你实现一语句代码就能完成Excel功能。首…

java gt_JAVA泛型知识--gt; lt;? extends Tgt;和lt;? super Tgt;

extends T> 和 super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念extends T> 是指 “上界通配符(Upper Bounds Wildcards)”super T> 是指 “下界通配符(Lower Bounds Wildcards)”1. 为什么要用通配符和边界&#xff1f;使用泛型的过程…

使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

工作上有个业务&#xff0c;.Net Core WebAPI作为服务端&#xff0c;需要将运行过程中产生的日志分类&#xff0c;并实时推送到各种终端进行报警&#xff0c;终端有桌面(WPF)、移动(Xamarin.Forms)、网站(Angular.JS)等&#xff0c;使用SignalR进行警报日志推送。微信公众号&am…

java图形包_java流布局图形包

第一步&#xff1a;导包import java.awt.FlowLayout;import javax.swing.JButton;import javax.swing.JFrame;第二步&#xff1a;定义类public class TestFlayOut {public static void main(String[] args) {JFrame jf new JFrame("流布局DEMO"); //建立一个窗口Flo…

ASP.Net Core 3.1 中使用JWT认证

JWT认证简单介绍关于Jwt的介绍网上很多&#xff0c;此处不在赘述&#xff0c;我们主要看看jwt的结构。JWT主要由三部分组成&#xff0c;如下&#xff1a;HEADER.PAYLOAD.SIGNATUREHEADER包含token的元数据&#xff0c;主要是加密算法&#xff0c;和签名的类型&#xff0c;如下面…

C++继承的继承方式

继承方式一共有三种&#xff1a; 1.公共继承 2.保护继承 3.私有继承

与其每天重复,不如试着构建「正反馈闭环」

大家好&#xff0c;我是Z哥。我们程序员应该算是相对比较有毅力的一个群体了&#xff0c;毕竟入行的高门槛首先就刷掉了一批无法坚持到胜任coding工作的人。况且&#xff0c;新技术的更迭相比其它行业快的多&#xff0c;需要持续学习。即使这样&#xff0c;肯定每个程序员都还有…

2008至今,Chrome如何成长为霸主

2008 年&#xff0c;微软的 Internet Explorer&#xff08;IE&#xff09;浏览器几乎占据了全球浏览器市场份额的 60%&#xff1b;Mozilla 的 Firefox 紧随其后&#xff0c;市场份额约为三分之一&#xff1b;于当年 9 月 2 日初亮相的 Chrome 浏览器则仅占有 0.3% 的市场份额。…

C++继承中构造和析构顺序

子类继承父类后&#xff0c;当创建子类对象&#xff0c;也会调用父类的构造函数 问题&#xff1a;父类和子类的构造和析构顺序是谁先谁后&#xff1f; 代码如下&#xff1a; #include <iostream> using namespace std; //继承中的构造和析构顺序class Base {public:Ba…

linux java -xms_java.lang.OutOfMemoryError及解决方法

主要有3种比较常见的OutOfMemory Error&#xff1a;Java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: GC overhead limit exceeded1. java.lang.OutOfMemoryError: Java heap spaceJava heap space&#xff…

Excel模板导出之导出教材订购表

说明本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出。要点本教程使用Magicodes.IE.Excel来完成Excel模板导出需要通过创建Dto来完成导出需要按要求准备Excel模板主要步骤1.安装包Magicodes.IE.Excel在本篇教程中&#xff0c;我们仅演示使用Excel来完成…

BeetleX网关非法Url请求拦截插件

一旦网站部署到互联网上&#xff0c;就会受到一些非法的请求&#xff0c;而这些请求的Url都是一些特定的路径或带上一些无关请求的字符用于探测一些服务存在的问题&#xff1b;还有这些请求会落到日志中&#xff0c;导致日志臃肿和转发到后台服务带来处理上的损耗。为了应对拦截…