Jx.Cms开发笔记(二)-系统登录
界面

此界面完全抄了BootstrapAdmin
css隔离
由于登录页面的css与其他页面没有什么关系,所以为了防止其他界面的css被污染,我们需要使用css隔离。
css隔离需要在_Host.cshtml中添加一条css引用。此引用如果使用Blazor模板创建项目时会自带,如果自己添加新的Area,则需要自己加入。
格式为
<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet">
如果是在RCL中使用,则需要添加
<link href="_content/{ASSEMBLY NAME}/{ASSEMBLY NAME}.bundle.scp.css" rel="stylesheet">
这里我们创建一个Login.razor.css来启用css隔离。
Blazor Server登录
在Blazor 组件库 BootstrapBlazor中 Ajax 组件的使用中我们提到过,当BlazorServer连接上以后,我们就无法在进行cookie操作了,所以这里需要使用浏览器端进行Ajax处理。
这里就需要我们的Ajax组件登场了。
我们首先添加<Ajax></Ajax>标签,然后在登录按钮的DoLogin中编写代码。
private async Task DoLogin()
{
if (LoginVo.UserName.IsNullOrEmpty())
{
await MessageService.Show(new MessageOption()
{
Color = Color.Danger,
Content = "用户名不能为空"
});
return;
}
if (LoginVo.Password.IsNullOrEmpty())
{
await MessageService.Show(new MessageOption()
{
Color = Color.Danger,
Content = "密码不能为空"
});
return;
}
var ajaxOption = new AjaxOption
{
Url = "/api/Admin/User/Login",
Data = LoginVo
};
var str = await AjaxService.GetMessage(ajaxOption);
if (str.IsNullOrEmpty())
{
await MessageService.Show(new MessageOption()
{
Color = Color.Danger,
Content = "登录失败"
});
}
else
{
dynamic ret = Clay.Parse(str);
if (ret.code != 20000)
{
await MessageService.Show(new MessageOption()
{
Color = Color.Danger,
Content = ret.message
});
}
else
{
await MessageService.Show(new MessageOption()
{
Color = Color.Success,
Content = "登录成功"
});
ReturnUrl ??= "/Admin";
await AjaxService.Goto(ReturnUrl);
}
}
}
这里我们统统使用Message组件来做信息提示。
首先判断用户名密码不为空,这个就不说了。
后面的
var ajaxOption = new AjaxOption
{
Url = "/api/Admin/User/Login",
Data = LoginVo
};
var str = await AjaxService.GetMessage(ajaxOption);
即为主要代码,发送LoginVo到Webapi的Controller。
Controller代码如下:
[HttpPost]
public async Task<object> Login([FromBody]LoginVo loginVo)
{
if (loginVo.UserName.IsNullOrEmpty())
{
return new { code = 50000, message = "用户名不能为空" };
}
if (loginVo.Password.IsNullOrEmpty())
{
return new { code = 50000, message = "密码不能为空" };
}
var entity = _adminUserService.Login(loginVo.UserName, loginVo.Password);
if (entity != null)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, entity.UserName));
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 = "用户名或密码错误" };
}
这里也是首先验证用户名密码是否正确,然后调用关键语句
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, entity.UserName));
await Furion.App.HttpContext.SignInAsync(new ClaimsPrincipal(identity), new AuthenticationProperties(){IsPersistent = true, ExpiresUtc = loginVo.RememberMe? DateTimeOffset.Now.AddDays(5): DateTimeOffset.Now.AddMinutes(30)});
这里我们使用微软自带的Claim的方式来进行身份验证,这也是BlaozrSrever里最简单的办法。
使用HttpContext.SignInAsync即可登录。
另外的配置
我们需要在Startup中增加身份验证的配置,这里我们用cookie,在ConfigureServices中添加
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(op =>
{
op.LoginPath = "/Admin/Login";
});
另外需要在Configure中添加
app.UseAuthentication();
app.UseAuthorization();
登录成功后跳转
由于BlazorServer建立连接后并不会再传输cookie,所以我们必须重新刷新一下页面,重新让Blazor建立连接,所以Ajax组件特意增加了一个Goto方法从浏览器进行跳转。
await AjaxService.Goto(ReturnUrl);
跳转后即可正常使用权限系统了。
结束
这样,我们的登录就完成了。
Jx.Cms开发笔记(二)-系统登录的更多相关文章
- Jx.Cms开发笔记(六)-重写Compiler
我们在Jx.Cms开发笔记(三)-Views主题动态切换中说了如何切换主题.但是这里有一个问题,就是主题切换时,会报错 这是由于asp.net core在处理Views的信息的时候是在构造函数中处理的 ...
- Jx.Cms开发笔记(一)-Jx.Cms介绍
开始 从今天开始,我们将开启Jx.Cms系列开发教程. 我们将会使用Jx.Cms来介绍Blazor的开发.MVC的开发,热插拔插件的开发等等一系列开发教程. 介绍 Jx.Cms是一个使用最新版.NET ...
- Jx.Cms开发笔记(四)-改造Card组件
在Blazor 组件库 BootstrapBlazor 中Card组件介绍中我们说过,如果我们使用了Card组件的IsCollapsible属性设置了可伸缩的话,就只能使用Text属性来设置标题文本, ...
- Jx.Cms开发笔记(五)-文章编辑页面标签设计
标签页的样子 设计思路 与其他输入框一样,存在一个Label标签,由于这里不像其他输入框一样可以直接使用Row标签,所以这里需要额外增加. 使用Tag组件显示所有的标签,我们在Blazor 组件库 B ...
- Django开发笔记二
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...
- SDL开发笔记(二):音频基础介绍、使用SDL播放音频
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- EasyUI 开发笔记(二)
接上篇 :EasyUI 开发笔记(一) (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...
- Vue-cli开发笔记二----------接口调用、配置全局变量
我做的一个项目,本身是没用任何框架,纯手写的前端及数据交互,项目已经完结.最近学Vue,于是借用这个项目,改装成vue项目. (一)接口问题:使用axios的调用方法,proxyTable解决开发环境 ...
随机推荐
- notepad++给每一列数据加单引号及逗号结尾
原始数据: 对列操作--先加前引号(光标放在第一行哦):编辑-->列块编辑 再加后引号和逗号(文本尾端不齐,就用替换): 打开替换窗口:ctrl+F(其实就是查找) 加完引号和逗号效果:(如果最 ...
- 时间模块 time 随机模块random os模块,sys模块
时间模块 time #时间模块 import time #三种格式 #时间戳时间:是一个浮点数,以秒为单位,计算机用语 #结构化时间 :是一个元组 #用于中间转换 #格式化时间:str数据类型, 用 ...
- Redis的Unable to connect to Redis和java.io.IOException: 远程主机强迫关闭了一个现有的连接问题的解决
学习项目xhr系统用到springboot + vue(https://github.com/lenve/vhr),文档中要求使用到RabbitMQ,但是从我搭建开发环境来看,是否配置Rabbit ...
- P5017 [NOIP2018 普及组] 摆渡车
P5017 [NOIP2018 普及组] 摆渡车 题目 P5017 思路 将实际问题抽象后,不难发现这是一个 区间 \(DP\) 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对应数轴上可能重合 ...
- 羽夏看Win系统内核——调试篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- java 集合及其线程安全 及其 set linkedList map table 区别
早在jdk的1.1版本中,所有的集合都是线程安全的.但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高 ...
- 在Spring框架中如何更有效地使用JDBC?
使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻.所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地 ...
- 什么是 NetflixFeign?它的优点是什么?
Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序.Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定 ...
- Linux用户无法使用sudo命令
新建的用无法使用sudo命令,出现这样的提示: xiaojing is not in the sudoers file. This incident will be reported 原来是新建的用户 ...
- can总线第三讲
一 CAN控制器官方定义:CAN控制器用于将欲收发的信息(报文),转换为符合CAN规范的CAN帧,通过CAN收发器,在CAN-bus上交换信息.举个便于理解的例子:就像您发快递一样,要根据快递公司提 ...