从零开始Blazor Server(4)--登录系统
说明
上一篇文章中我们添加了Cookie授权,可以跳转到登录页了。但是并没有完成登录,今天我们来完成它。
我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样。有个小区别是必须使用MVC去登录,Blazor本身是登录不了的。
添加Controller支持
在Program.cs中添加:
builder.Services.AddControllers().AddInject();
这里的.AddInject()是添加Furion的支持,我们后面要用到的动态Controller就是需要添加这个。另外.AddInject()自带了Swagger,如果不想要,需要使用.AddInjectBase()。
app.UseInject();
需要添加Swagger支持的话需要将app.UseInjectBase();这里改为app.UseInject();。
最后别忘了添加
app.MapDefaultControllerRoute();
将Controller的路由加上去。
编写LoginController
public class LoginController: IDynamicApiController
{
public async Task<object> Post([FromBody]LoginVo loginVo)
{
if (string.IsNullOrEmpty(loginVo.UserName))
{
return new { code = 50000, message = "用户名不能为空" };
}
if (string.IsNullOrEmpty(loginVo.Password))
{
return new { code = 50000, message = "密码不能为空" };
}
var password = MD5Encryption.Encrypt(loginVo.Password);
var user = await UserEntity.Where(x =>
x.UserName == loginVo.UserName && x.Password == password).Include(x => x.Role).FirstAsync();
if (user != null)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName!));
identity.AddClaim(new Claim(ClaimTypes.Role, user.Role!.Name!));
await Furion.App.HttpContext.SignInAsync(new ClaimsPrincipal(identity), new AuthenticationProperties(){IsPersistent = true, ExpiresUtc = loginVo.RememberMe? DateTimeOffset.Now.AddDays(5): DateTimeOffset.Now.AddMinutes(30)});
return new { code = 20000, message = "登录成功" };
}
return new { code = 50000, message = "用户名或密码错误" };
}
}
其中用的LoginVo为
public class LoginVo
{
public string? UserName { get; set; }
public string? Password { get; set; }
public bool RememberMe { get; set; }
}
这里我们使用var user = await UserEntity.Where(x => x.UserName == loginVo.UserName && x.Password == password).Include(x => x.Role).FirstAsync();
去数据库里查询是否存在这个用户名密码的用户
然后创建一个Claim,我这里把UserName和RoleName放进去了,为了后面好显示。
最后就是HttpContext.SignIn,这个也是登录的标准路子。
Login.razor
Login.razor我们直接照搬了BootstrapAdmin的登录样式,搬运一下,懒得自己写了。这里只说关键代码部分。
首先,因为我们说过,登录需要使用MVC的方式,所以这里需要使用浏览器发送Ajax请求的方式来登录。
这里我们使用BootstrapBlazor自带的AJAX组件来处理。
首先在Login.razor中添加<Ajax></Ajax>组件进来。
然后使用
var ajaxOption = new AjaxOption
{
Url = "/api/login",
Data = LoginVo
};
var str = await AjaxService.GetMessage(ajaxOption);
使用POST发送LoginVo到/api/login。
这个str就是返回的结果。
如果str是空的,或者code不是上面返回的20000,即登录成功的话,我们就使用飘窗报错。成功我们就跳转。
这里注意一下,跳转的时候一定不能用Blazor的NavigationManager,因为我们必须刷新一次浏览器,服务端才能拿到对应的Cookie,所以这里还是使用Ajax组件的Goto去跳转,这种跳转实际上是浏览器刷新,会重走一次MVC的逻辑。
这样我们的登录就写好了。尝试输入用户名密码都是Admin(我们在DbExtension初始化的默认用户)。应该可以登录成功,输入别的话应该会报失败。
源码在github:https://github.com/j4587698/BlazorLearn,分支为lesson4
从零开始Blazor Server(4)--登录系统的更多相关文章
- 从零开始Blazor Server(15)--总结
我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...
- 从零开始Blazor Server(1)--项目搭建
项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...
- 从零开始Blazor Server(3)--添加cookie授权
认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...
- 从零开始Blazor Server(6)--基于策略的权限验证
写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...
- 从零开始Blazor Server(8)--增加菜单以及调整位置
这篇干啥 这篇文章主要是把前面的一些东西稍微调整一下,使其更适合后面的内容. 主要是两个事,一个是把原来的PermissionEntity直接变成MenuEntity,直接让最后一级是菜单,这样后面就 ...
- 从零开始Blazor Server(5)--权限验证
序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...
- 从零开始Blazor Server(7)--使用Furion权限验证
序 上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限. 其实我们既然集成了Fution,就可以用Furion带的方式来验证. 创建AdminHandler 我 ...
- 从零开始Blazor Server(9)--修改Layout
目前我们的MainLayout还是默认的,这里我们需要修改为BootstrapBlazor的Layout,并且处理一下菜单. 修改MainLayout BootstrapBlazor已经自带了一个La ...
- 从零开始Blazor Server(12)--编辑菜单
上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...
随机推荐
- 机构:DARPA
DARPA,美国国防部高级研究计划局. 2021年3月19日,英特尔(Intel)宣布与美国国防部高级研究计划局(DARPA)达成的一项新合作,旨在推动在美制造的专用集成电路(ASIC)芯片的开发. ...
- jQuery基础入门+购物车案例详解
jQuery是一个快速.简洁的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多 ...
- 人体调优不完全指南「GitHub 热点速览 v.22.22」
本周特推又是一个人体调优项目,换而言之就是如何健康生活,同之前的 HowToLiveLonger研究全因死亡率不同,这个项目更容易在生活中实践,比如,早起晒太阳这么一件"小事"便有 ...
- golang 方法接收者
[定义]: golang的方法(Method)是一个带有receiver的函数Function,Receiver是一个特定的struct类型,当你将函数Function附加到该receiver, 这个 ...
- VS Code - Vim 插件自动切换输入法
前言: 在使用 Linux 的过程中,vim 是一个不错的编辑器,以至于多数人将其用成了习惯,在没有 vim 的环境下还是习惯用 vim 的快捷键来编辑文本.所以便有开发者们为众多的 IDE 和文本编 ...
- GraphX 图计算实践之模式匹配抽取特定子图
本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...
- Jmeter基础入门应用举例
举例当然应该有接口下面以常用的百度搜索接口为例: 1.接口地址: http://www.baidu.com/s?ie=utf-8&wd=jmeter性能测试 2.请求参数 ie:编码方式,默认 ...
- java中的方法重载(overload)
什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...
- Bika LIMS 开源LIMS集—— SENAITE的安装
安装环境 操作系统 Ubuntu 18.04 LTS Python 2.x. Plone 4 安装步骤 Ubuntu等Linux.Mac系统一般安装有Python的环境,但由于需要安装Python扩展 ...
- go程序添加远程调用tcpdump功能
最近开发的telemetry采集系统上线了.听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器.交换机)将它们的各种统计数据上报采集.整理后交后端的各类AI分析系统分析.目前华为 ...