从零开始一起学Blazor WebAssembly 开发(4)
登录模块基本完成了,登录主要用了以下几个点:
1、后端采用的Abp Vnext 框架,这个框架自带的IdentityServer4用户角色权限控制,这个框架登录研究了好一阵子,有几个坑这里说下:
1)、Login.Razor利用HttpClient把用户名和Rsa加密后的密码提交到后端,后端把密码解密后再往IdentityServer4的服务器获取Token(用的oauth2.0 里的密码模式),这块知识网上能搜到不少,重点说一下这里有个坑,就是我之前不知道的,传scope时,要传 offline_access 这个 才能返回RefreshToken,因为IdentityServer4 默认提供的是JWT令牌,这个令牌相关的资料也能从网上搜到不少,这里就不讲了。这个令牌有个缺点,就是服务器控制不了退出,解决办法就是让accesstoken有效时间变短,快到期时用refreshtoken 刷新,这个refreshtoken 我建议是保存在后端,不要往前端放,需要刷新时,前端传请求过来。如果必须要放在前端,IdentityServer4 提供了OneTimeOnly这种设置。就是只能用一次就换的。
2)、IdentityServer4在每次请求之前框架有一个调用发现文档的服务(httpClient.GetDiscoveryDocumentAsync)。这个服务就是返回IdentityServer4所支持的服务,研究了下Abp vnext框架自带的,发现每次都调用这块太耗时间。就想把结果放在缓存里,结果试了很久,发现Abp自带的缓存框架处理不好这个,自己另外写也不是不行。但是就感觉不太好。然后研究发现,其实IdentityServer4 也带了一个发现文档缓存的方法IDiscoveryCache,用这个就能实现了,具体使用方法这里讲一下,因为我发现网上这个资料真不多:
a 先注入
//发现文档缓存
context.Services.AddSingleton<IDiscoveryCache>(r =>
{
var factory = r.GetRequiredService<IHttpClientFactory>();
//var policy = new DiscoveryPolicy() { },用到可以加下
var dc = new DiscoveryCache(configuration["IdentityClients:Default:Authority"], () => factory.CreateClient());
//dc.CacheDuration = TimeSpan.FromMinutes(2); 缓存有效期, 默认是24小时,需要改的话自己改
return dc;
});
b 使用
private readonly IDiscoveryCache _ddrcache;
//上下两处代码结合自己的项目的Service,自己分别写。
var disco = await _ddrcache.GetAsync();
if (disco.IsError)
{
throw new Exception(disco.Error);
}
return disco;
3)、前端和后端不是在同一个域里边,原本以为webAssembly 有点近似客户端,应该不会有这个问题。发现还真的有,这就需要在后端设置下跨域设置,否则提交不了。
2、登录后前端得到Token,要把Token信息保存到localstore里,这里用到了网上一个大神的解决方案,直接看代码
public class TokenUtil
{
private readonly IJSRuntime _jsRuntime;
public TokenUtil(IJSRuntime jsRuntime)
{
_jsRuntime = jsRuntime;
}
public async Task SaveAccessToken(string accessToken)
{
await _jsRuntime.InvokeVoidAsync("wasmHelper.saveAccessToken", accessToken);
}
public async Task<String> GetAccessToken()
{
return await _jsRuntime.InvokeAsync<String>("wasmHelper.getAccessToken");
}
public async Task RefreshToken(string tokenValue)
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenValue);
await httpClient.GetFromJsonAsync<TokenInfo>("");
}
}
var wasmHelper = {}; wasmHelper.ACCESS_TOKEN_KEY = "__access_token__"; wasmHelper.saveAccessToken = function (tokenStr) {
localStorage.setItem(wasmHelper.ACCESS_TOKEN_KEY, tokenStr);
}; wasmHelper.getAccessToken = function () {
return localStorage.getItem(wasmHelper.ACCESS_TOKEN_KEY);
};
登录模块完成了,剩下就是些细节了。没有什么技术难题。
从零开始一起学Blazor WebAssembly 开发(4)的更多相关文章
- 一起学Blazor WebAssembly 开发(1)
最近blazor的WebAssembly 正式版出来了,正好手头有一个项目采用的前后端分离模式做的,后端用的abp vnext(.net core 的一个很著名的框架)框架开发的,其实前端之前考虑的使 ...
- 一起学Blazor WebAssembly 开发(3)
接着上篇,本篇开始讲下实现登录窗口,先看下大概的效果图: 打开的效果,没有美工美化 点登录校验得到不能为空 我在做blazor时用到了一个ui框架,这个框架名叫Ant Design blazor(ht ...
- 一起学Blazor WebAssembly 开发(2)
上篇文章讲了Blazor的两种模式的区别及各自的使用场景,本篇就开始学习WebAssembly模式,本篇主要学习的是创建项目及认识项目结构: 创建项目 选择Blazor应用 选择WebAssembly ...
- Blazor Webassembly多标签页开发
最近准备用Blazor Webassembly做后台开发要用到多标签页,找了半天发现绝大多数都是Blazor Server的多标签没有Webassembly.没办法只能自己想办法造轮子了. 查了许多资 ...
- 浏览器中的 .Net Core —— Blazor WebAssembly 初体验
前言 在两年多以前就听闻 Blazor 框架,是 .Net 之父的业余实验性项目,其目的是探索 .Net 与 WebAssembly 的兼容性和应用前景.现在这个项目已经正式成为 Asp.Net Co ...
- ASP.NET Core Blazor 初探之 Blazor WebAssembly
最近Blazor热度很高,传说马上就要发布正式版了,做为微软脑残粉,赶紧也来凑个热闹,学习一下. Blazor Blazor是微软在ASP.NET Core框架下开发的一种全新的Web开发框架.Bla ...
- 从零开始单排学设计模式「装饰模式」黑铁 I
阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...
- 从零开始单排学设计模式「简单工厂设计模式」黑铁 III
阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...
- 通过 Serverless 加速 Blazor WebAssembly
Blazor ❤ Serverless 我正在开发 Ant Design 的 Blazor 版本,预览页面部署在 Github Pages 上,但是加载速度很不理想,往往需要 1 分钟多钟才完成. 项 ...
随机推荐
- SpringBoot中注入ApplicationContext对象的三种方式
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 在项目中,我们可 ...
- 用Map+函数式接口来实现策略模式
用Map+函数式接口来实现策略模式 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一起交 ...
- 关于idea的一些快捷键
最近在用idea写代码,熟悉一些快捷键的使用能够让写代码的速度提高,以下快捷键是默认idea的快捷键,当然我们可以自己修改的: 自动补全代码快捷键:CTRL+alt+V 自动格式化代码:CTRL+al ...
- Mariadb之显式使用表锁和行级锁
首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁 ...
- 计算机网络之tcp三次握手
客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西:由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客 ...
- 联通BSS-ESS-CBSS系统安装相关
前言 1. 版本信息 版本 日期 记录 1.0 2016.08.15 初始版本 2. 作者信息 信息 内容 部门 夷陵区分公司 作者 Z.J.T 邮箱 coralfoxzjt@163.com 必须操作 ...
- springboot集成springDataJpa
1.引用依赖 <!--spring-data-jpa--> <dependency> <groupId>org.springframework.boot</g ...
- HotSpot项目结构
之前已经介绍了在Ubuntu 16.04上编译OpenJDK8的源代码和调试HotSpot源代码.这一章将介绍HotSpot项目的目录结构. HotSpot目录下主要由agent.make.src和t ...
- 相邻元素之间的margin合并问题
任何元素都可以设置border 设置宽高可能无效 行内元素设置padding,margin上下是无效的,左右是有效的 外边距合并:指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距 ...
- CF3D Least Cost Bracket Sequence 题解
题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...