当前位置: 首页 > news >正文

免费ps模板下载网站建立网站需要注意事项

免费ps模板下载网站,建立网站需要注意事项,房屋装修网,线上免费推广平台都有哪些#xff08;一个真正的以后端形式来集成认证中心的方案#xff09;❤本文导读首先特别感谢张善友老师提供技术指导#xff0c;源于上周我发了一篇文章《[Mvp.Blazor] 集成Ids4#xff0c;实现统一授权认证》#xff0c;我本来是想通过像vue框架那样#xff0c;通过引oidc… 一个真正的以后端形式来集成认证中心的方案❤本文导读首先特别感谢张善友老师提供技术指导源于上周我发了一篇文章《[Mvp.Blazor] 集成Ids4实现统一授权认证》我本来是想通过像vue框架那样通过引oidc-client.js的方式来实现Ids4的集成问题我当时以为已经很好的后来看了张队发的文章以后发现好像我写的那种方式并不优雅。所以我又重新改了一次但是代码保留了新建了对应的分支以适应在Blazor服务端集成ids4的完美体验如果你是wasm的项目也不需要引用张队已经写好了组件大家看看引用下即可https://github.com/BlazorHub/AntDesignTemplate那今天我就快速的给大家说一下如何在Blazor服务端来设计和集成认证中心当然里边会涉及一些基础知识点我就不展开了所以你自己需要先掌握以下知识储备Ids4配置授权码模式客户端Razor page的On{handler}{Async}()语法HttpContext.User基本使用第一部分配置认证方案在上一篇文章中我们主要是通过oidc-client.js的形式进行ids4的连接的。但是我们的项目毕竟是服务端Blazor服务端使用ids4感觉和MVC还是有些相似的都是基于Cookie的oidc认证模式。认证中心配置下客户你可以看到基本就是和MVC配置是一样的不仅认证中心的客户端配置很像就连项目中认证服务的注册的方式也是几乎一样引用nuget包Microsoft.AspNetCore.Authentication.OpenIdConnect startup中注册认证服务 // 第一步:配置认证方案services.AddAuthentication(options {options.DefaultScheme Cookies;options.DefaultChallengeScheme oidc;}).AddCookie(Cookies).AddOpenIdConnect(oidc, options {options.Authority https://ids.neters.club/;options.ClientId blazorserver; // 75 secondsoptions.ClientSecret secret;options.ResponseType code;options.SaveTokens true;// 为api在使用refresh_token的时候,配置offline_access作用域options.GetClaimsFromUserInfoEndpoint true;// 作用域获取options.Scope.Clear();options.Scope.Add(roles);//rolesoptions.Scope.Add(rolename);//rolenameoptions.Scope.Add(blog.core.api);options.Scope.Add(profile);options.Scope.Add(openid);options.Events new OpenIdConnectEvents{// called if user clicks Cancel during loginOnAccessDenied context {context.HandleResponse();context.Response.Redirect(/);return Task.CompletedTask;}};});相应的注释我简单的写了写当然文章的开篇我也说了这一块属于ids4的基础部分以前的文章和视频说了很多了以后我就不打算讲解了。重点是要配置那几个Scope作用域然后可以看到有ids4的授权页面当然这个页面也可以屏蔽掉不显示。注册好了服务那肯定是要开启中间件了开启中间件app.UseAuthentication(); 第二部分登录、登出的页面设计这里我们使用到了Razor的Page功能添加登录和登出功能具体的使用方法可以在微软官网查看相应的代码很简单登录、登出 // 这里用到了缓存来管理我们的用户登录信息下文会讲到// 第二部分: 配置razor page,定义登录,登出等逻辑public class _HostAuthModel : PageModel{public readonly AuthStateCache Cache;public _HostAuthModel(AuthStateCache cache){Cache cache;}// 每次刷新页面异步加载public async TaskIActionResult OnGet(){System.Diagnostics.Debug.WriteLine($\n_Host OnGet IsAuth? {User.Identity.IsAuthenticated});// 判断Httpcontext是否登录状态if (User.Identity.IsAuthenticated){var sid User.Claims.Where(c c.Type.Equals(sid)).Select(c c.Value).FirstOrDefault();System.Diagnostics.Debug.WriteLine($sid: {sid});// 如果缓存中不存在if (sid ! null !Cache.HasSubjectId(sid)){var authResult await HttpContext.AuthenticateAsync(oidc);DateTimeOffset expiration authResult.Properties.ExpiresUtc.Value;string accessToken await HttpContext.GetTokenAsync(access_token);string refreshToken await HttpContext.GetTokenAsync(refresh_token);Cache.Add(sid, expiration, accessToken, refreshToken);}}return Page();}// 登录public IActionResult OnGetLogin(){System.Diagnostics.Debug.WriteLine(\n_Host OnGetLogin);var authProps new AuthenticationProperties{IsPersistent true,// 设置token的过期时间相当于前端的localstorageExpiresUtc DateTimeOffset.UtcNow.AddHours(1),RedirectUri Url.Content(~/)};// 认证中心登录return Challenge(authProps, oidc);}// 登出public async Task OnGetLogout(){System.Diagnostics.Debug.WriteLine(\n_Host OnGetLogout);var authProps new AuthenticationProperties{RedirectUri Url.Content(~/)};await HttpContext.SignOutAsync(Cookies);await HttpContext.SignOutAsync(oidc, authProps);}}代码中我已经增加了相应的注释信息你应该能看的明白。只不过具体的写法有些小伙伴可能没用过RazorPage这里简单的说一下因为我们的Index页面没有绑定任何数据所以这里基本上只继承了PageModelOnGet方法是个约定查看mvc的源码你会发现它会获取On{handler}{Async}()。比如OnGet它会在Get Index的时候被执行我们可以通过这个约定进行数据绑定这里知道下在Razor Page下HttpMethod也是一个handler所以Razor Page的处理方式是通过handler进行的。为了实现这个效果我们还需要配置主页面_Host.cshtml的路由page /{handler?} 你可能会好奇那既然要使用到认证中心了为啥还需要登录登出呢其实客户端都是需要的不信你用mvc项目也需要配置的。权限组件Blazor自带了相应的授权组件可以很好的帮助我们来实现对权限的控制只需要在App.razor中inject NavigationManager NavManagerRouter AppAssemblytypeof(Program).AssemblyFound ContextrouteDataAuthorizeRouteView RouteDatarouteData DefaultLayouttypeof(MainLayout)NotAuthorized{// 使用权限组件,如果当然组件配置Authorize,并且用户未登录,则跳转登录页(这里是ids4)NavManager.NavigateTo(/Login, true);}/NotAuthorizedAuthorizingh1Authentication in progress/h1pOnly visible while authentication is in progress./p/Authorizing/AuthorizeRouteView/FoundNotFoundCascadingAuthenticationStateLayoutView Layouttypeof(MainLayout)h1Sorry/h1pSorry, theres nothing at this address./p/LayoutView/CascadingAuthenticationState/NotFound /Router 大概意思就是我们可以指定我们的razor页面是否需要加权如果不配置那就是很正常的浏览比如我们的博客index首页肯定不能加权除非是后台管理系统那就需要每个页面都加权了配置好后如果用户未登录那就会立刻跳转到上边我们配置的登录地址跳转到认证中心。那如何对特定页面加权呢很简单。razor页面加权只需要在需要的页面内增加特性即可attribute [Authorize] 展示用户状态刚刚上边我们已经配置好了用户登录和登出接口也对页面进行了加权用来引导用户去认证中心登录或者单点登录拉取用户信息那如何展示呢很简单在主页面_Host.cshtml中使用User属性来实现model _HostAuthModelif (User.Identity.IsAuthenticated){div idlogined styledisplay: contents;div classmenu-item my-2 my-md-0 mr-md-3 dropdownbutton typebutton classbtn btn-primary dropdown-toggle data-toggledropdown设置 - span idusername(userName) /span/buttondiv classdropdown-menu/div/diva classmenu-item my-2 btn btn-outline-primary href/logout注销/a/div}else{div idaccesseda classmenu-item my-2 btn btn-outline-primary href/login登入/a/div}具体的代码看我的项目即可。那到了这里我们已经完成了Blazor服务端如何集成ids4的代码不过这样还是有些问题的比如如果获取access_token来访问第三方的资源服务器api呢第三部分管理用户授权状态之前我们用js方法的时候还记得吗我们使用的是localstorage的形式存在了客户端包括用户信息令牌过期时间等等然后通过JSRuntime来实现对js的控制和使用那今天我们不用js了如何来管控呢我这里用的是内存缓存的形式当然你可以使用Redis来实现分布式思路都一样。用户数据存储cache在上边的登录的时候我们看到了每次登录成功回调的时候都会刷新页面也当然会执行OnGet()方法这样就会把当然用户的信息通过特定的sid作为缓存key的形式来保存到内存里这个sid就像是session一样每次登录成功回调后都会有一个唯一的字符串作为标识开发过微信的应该都知道。那就定义一个cache管理类 public class AuthStateCache{private ConcurrentDictionarystring, ServerAuthModel Cache new ConcurrentDictionarystring, ServerAuthModel();public bool HasSubjectId(string subjectId) Cache.ContainsKey(subjectId);public void Add(string subjectId, DateTimeOffset expiration, string accessToken, string refreshToken){System.Diagnostics.Debug.WriteLine($Caching sid: {subjectId});var data new ServerAuthModel{SubjectId subjectId,Expiration expiration,AccessToken accessToken,RefreshToken refreshToken};Cache.AddOrUpdate(subjectId, data, (k, v) data);}public ServerAuthModel Get(string subjectId){Cache.TryGetValue(subjectId, out var data);return data;}public void Remove(string subjectId){System.Diagnostics.Debug.WriteLine($Removing sid: {subjectId});Cache.TryRemove(subjectId, out _);}} 这个很简单就不多说了就是对用户数据的增删改查标识就是sid。那现在就有了一个问题我们知道登录的时候是存到cache里的那什么时候删除呢请往下看。AuthenticationStateProvider 服务这个服务是今天的重头戏你需要好好的了解一下它的作用内置的 AuthenticationStateProvider 服务可从 ASP.NET Core 的 HttpContext.User 获取身份验证状态数据。 身份验证状态就是这样与现有 ASP.NET Core 身份验证机制集成。AuthenticationStateProvider 服务可以提供当前用户的 ClaimsPrincipal 数据。简单的概况呢就是开启这个服务我们可以获取当前用户的claim声明并且定期的做一个筛查就像是一个定时器每十秒执行一次判断当前用户是否过期如果正好过期了就把这个cache记录给删掉。 /// summary/// 配置状态服务处理器,定时校验授权状态/// RevalidationInterval为刷新时间,类似于滑动时间/// /summarypublic class AuthStateHandler : RevalidatingServerAuthenticationStateProvider{private readonly AuthStateCache Cache;public AuthStateHandler(ILoggerFactory loggerFactory,AuthStateCache cache): base(loggerFactory){Cache cache;}protected override TimeSpan RevalidationInterval TimeSpan.FromSeconds(10); // TODO read from configprotected override Taskbool ValidateAuthenticationStateAsync(AuthenticationState authenticationState, CancellationToken cancellationToken){var sid authenticationState.User.Claims.Where(c c.Type.Equals(sid)).Select(c c.Value).FirstOrDefault();if (sid ! null Cache.HasSubjectId(sid)){var data Cache.Get(sid);System.Diagnostics.Debug.WriteLine($NowUtc: {DateTimeOffset.UtcNow.ToString(o)});System.Diagnostics.Debug.WriteLine($ExpUtc: {data.Expiration.ToString(o)});if(DateTimeOffset.UtcNow data.Expiration){System.Diagnostics.Debug.WriteLine($*** EXPIRED ***);Cache.Remove(sid);return Task.FromResult(false);}}else{System.Diagnostics.Debug.WriteLine($(not in cache));}return Task.FromResult(true);}} 思路就是这样自己应该能看明白就是定时做了一个判断然后删除cache。服务注册容器把上边的两个服务注册下 // 第三部分授权状态的保护与管理services.AddSingletonAuthStateCache();// 开启AuthenticationStateProvider 服务services.AddScopedAuthenticationStateProvider, AuthStateHandler(); 第四部分获取token访问api这一块和之前的逻辑是一样的通过HttpClient来实现对第三方资源服务器的api访问那肯定需要获取token这个就从上边的cache中获取 public async Taskstring GetAccessToken(){// 注意这获取声明数据有问题参考我的代码。获取当前用户的sid唯一标志var sid _accessor.HttpContext.User.Claims.Where(c c.Type.Equals(sid)).Select(c c.Value).FirstOrDefault();// 正常则返回结果if (sid ! null _cache.HasSubjectId(sid)){return _cache.Get(sid).AccessToken;}// 否则跳转登录页去认证中心拉取_navigationManager.NavigateTo(/Login, true);return await Task.FromResult(string.Empty);}到了这里我们的Blazor.Server服务端集成Ids4已经完成了是不是完全没用到任何的js来查看下效果吧可以看到完成了这样的流程首页不需要权限博客操作页需要登录并成功跳转认证中心登录后成功回调到首页并获取用户信息实现单点登录编辑的时候test用户返回Forbidden表明已经登录并实现了权限控制好啦自己动手试试吧。参考文章1、https://mcguirev10.com/2019/12/15/blazor-authentication-with-openid-connect.html2、https://github.com/BlazorHub/AntDesignTemplate
http://www.huolong8.cn/news/25461/

相关文章:

  • 宝应县住房建设局网站深圳罗湖企业网站优化
  • 网站产品图片尺寸如何做一个网站设计
  • 购买域名后用wordpress建站邢台市刚刚发生的事
  • 网站产品展示程序员常用的工具有哪些
  • thinkphp微网站开发wordpress4.9.6 主题安装
  • 佛山网站建设优势二网站手
  • wordpress xss跨站脚本漏洞网络公司市值最新排名
  • 河北省住房建设厅网站企业网站建设的方案ppt
  • 电子商务网站开发主要有哪些上市公司网站建设
  • 我要做个网站该怎么做网站跳转qq
  • 珠海网站关键词排名服务商wordpress 顶端加代码
  • 现在最常用网站开发工具网站多少钱
  • 网站 aspx 模板班服定制的网站
  • 想找人做网站怎么了解网络服务器
  • 做网站会很忙吗设计公司网站是什么是重要的
  • 专做智能化施工的网站直接在wordpress官网写博客
  • 如何介绍一个网站的促销功能新浪如何上传wordpress
  • 顶尖的设计网站怎样做直播网站app
  • 北京西站地址培训网址
  • 淘客手机网站源码wordpress博客自媒体资讯主题
  • 制作网站价格php图片网站源码
  • 网站建设维护多少钱申请一个域名
  • 辽阳网站建设关于公司网站怎么做
  • 国外h5网站模板免费域名app官方下载
  • 做网站单页如何建团购网站
  • 做水电到哪个网站找信息网站建设学多长时间
  • 河口企业网站开发公司网站开发毕设的需求分析
  • 湖州做网站的郑州做网站的外包公司
  • 英文阿里巴巴网站建设企查查官网查询
  • 饲料网站建设 中企动力网站基础建设和维护