【One by One系列】IdentityServer4(四)授权码流程

接下来我们介绍新内容,OAuth2.0叫做授权码(authorization code),在OpenID Connect中则属于OpenId Connect Flow,称为授权码流程(Authorization Code Flow),这种方式主要场景:

  • 保密客户端,服务器端的web应用

例如asp.net core mvc,这种由后端处理逻辑后,模板渲染的web框架

另外,这种方式主要是需要先去IdentityServer申请一个授权码,然后再用授权码获取token。这种方式广泛用于大厂的开放平台,如微信、华为等等。

这种方式的安全性最高,因为它是server-server,即web应用的后端与IdentityServer交互通信,token都是存储在后端。基本流程如下:

  • 1.请求IdentityServer的oauth/authorize? response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

redirect_uri为需要授权的应用的url

  • 2.callback?code=AUTHORIZATION_CODE

重定向至redirect_uri,且会在uri后增加授权码

  • 3.后端请求oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET& grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

再携带code,去token端点,获取token

在IdentityServer4中,大致也是这个流程,但是其中会有一些变化,为了安全,IdentityServer4是带有PKCE支持的授权码模式,后续我们会讲到,先让我们实践一下,感受一下。

1.IdentityServer增加UI

上两篇文章,主要针对的是客户端凭证和密码凭证,我们继续在IdentityServer项目中进行增量开发。

1.1 增加MVC UI模板代码

cd .\src\IdentityServer
dotnet new is4ui

1.2 MVC生效

在依赖注入和管道中使mvc生效

  • Startup.ConfigureServices

// uncomment, if you want to add an MVC-based UI
services.AddControllersWithViews();
  • Startup.Configure

// uncomment if you want to add MVC
app.UseStaticFiles();
app.UseRouting();app.UseIdentityServer();// uncomment, if you want to add MVC
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{endpoints.MapDefaultControllerRoute();
});

ps:is4inmem模板包含了基本的IdentityServer,同时也包含了标准UI界面(也就是上面添加的模板代码)

1.3 修改launchSettings.json

{"profiles": {"MVCClient": {"commandName": "Project","launchBrowser": true,"applicationUrl": "http://localhost:6002","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
}

1.4 增加客户端配置

new Client{ClientId="mvc",ClientSecrets={ new Secret("secret-mvc".Sha256())},AllowedGrantTypes = GrantTypes.Code,RequireConsent=true,// where to redirect to after loginRedirectUris = { "http://localhost:6002/signin-oidc" },// where to redirect to after logoutPostLogoutRedirectUris = { "http://localhost:6002/signout-callback-oidc" },AllowedScopes = new List<string>{"api1",IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile}}

2.创建新的asp.net core mvc客户端

2.1 新建项目

cd .\src\
dotnet new mvc -n MVCClient
dotnet sln add .\MVCClient\MVCClient.csproj

2.2 添加nuget引用

ASP.NET Core middleware that enables an application to support the OpenID Connect authentication workflow.

cd .\MVCClient\
dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect

2.3 注册OpenId Connect

using System.IdentityModel.Tokens.Jwt;// ...JwtSecurityTokenHandler.DefaultMapInboundClaims = false;services.AddAuthentication(options =>{options.DefaultScheme = "Cookies";options.DefaultChallengeScheme = "oidc";}).AddCookie("Cookies").AddOpenIdConnect("oidc", options =>{options.Authority = "http://localhost:5001";options.ClientId = "mvc";options.ClientSecret = "secret";options.ResponseType = "code";options.SaveTokens = true;//scopeoptions.Scope.Add("api1");});
  • AddAuthentication:添加身份认证服务

    • options.DefaultScheme=Cookies:我们使用cookie记录本地登录用户

    • options.DefaultChallengeScheme=oidc:需要用户登录,将使用OpenID Connect协议

  • AddCookie:添加cookies的处理器

  • AddOpenIdConnect:配置执行OpenID Connect协议的处理器相关参数

    • options.Authority:标识所信赖的token服务地址

    • options.ClientIdoptions.ClientSecret:标识MVC客户端

    • options.SaveTokens:保存从IdentityServer获取的token至cookie,ture标识ASP.NETCore将会自动存储身份认证session的access和refresh token

2.4 添加身份认证

 app.UseStaticFiles();app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}").RequireAuthorization();});

2.5 增加用户退出

最后一步,是增加用户退出操作。

对于像IdentityServer这样的身份认证服务,清除本地应用程序cookie是不够的。还需要往返于IdentityServer以清除中央单点登录的session。

在控制器中增加退出操作代码:

public IActionResult Logout()
{return SignOut("Cookies", "oidc");
}

在视图层_Layout.cshtml增加退出按钮

 <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse"><ul class="navbar-nav flex-grow-1"><li class="nav-item"><a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a></li><li class="nav-item"><a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a></li><li class="nav-item"><a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Logout">LoginOut</a></li></ul></div>

2.6 修改Home/Index.cshtml

为了测试效果,修改小标题所示的视图,让其展示认证授权后的User.Claims

@using Microsoft.AspNetCore.Authentication<h2>Claims</h2><dl>@foreach (var claim in User.Claims){<dt>@claim.Type</dt><dd>@claim.Value</dd>}
</dl><h2>Properties</h2><dl>@foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items){<dt>@prop.Key</dt><dd>@prop.Value</dd>}
</dl>

2.测试

启动IdentityServer

cd .\IdentityServer\
dotnet run

用vs启动MVCClient

  • 首先页面进入MVCClient起始页http://localhost:6002

  • 由于没有登录,将会跳转至登录页http://localhost:5001/Account/Login

  • 键入正确的用户名和密码,又会重定向至http://localhost:6002

测试访问api就不演示效果了,只给出相关代码:

controller代码:

public async Task<IActionResult> CallApi()
{var accessToken = await HttpContext.GetTokenAsync("access_token");var client = new HttpClient();client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);var content = await client.GetStringAsync("https://localhost:6001/api/identity");ViewBag.Json = JArray.Parse(content).ToString();return View("json");
}

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

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

相关文章

Nemuria UML架构图 第3次迭代. 重构

Nemuria UML架构图 第3次迭代. 重构

suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决

现象产生&#xff1a;服务器在挂载SUSE LINUX的系统光盘安装一些系统自带的RPM包后&#xff0c;发现HOME目录文件系统变成只读模式。附图&#xff1a;原因分析&#xff1a;在系统加载光盘之前一切正常&#xff0c;加载后出现这样的问题。加载光盘时&#xff0c;使用了mount命令…

3个值得学习和练手的.net企业级开源项目,强烈推荐

WTM项目名称&#xff1a;WTM项目所用技术栈&#xff1a;wtm mvvm mvc aspnetcore dotnetcore react vue layui layui-admin element-ui ncc等项目简介&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM&#xff09;是基于.net core的快速开发框架。支持Layui(前后端不分离),…

通过百度 vs 奇虎,来谈博客搜索

百度推出了博客搜索&#xff0c;几乎就是一个网页搜索的翻版而已&#xff0c;唯一和网页搜索不同的&#xff0c;就是&#xff1a;1、少了广告&#xff1b;2、增加了一个博客的首页连接。看起来&#xff0c;并无太大新意。当然&#xff0c;也许他留有后着&#xff0c;也未为可知…

linux服务器数据同步,Linux服务器数据定期同步和备份方式

数据安全是做数据分析的人需要关注的一大问题。对于我们分析的关键数据、使用的关键脚本都需要定期备份。scp最简单的备份方式&#xff0c;就是使用cp (本地硬盘)或scp (远程硬盘)命令&#xff0c;给自己的结果文件新建一个拷贝;每有更新&#xff0c;再拷贝一份。具体命令如下&…

2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

IEnumerator、IEnumerable这两个接口单词相近、含义相关&#xff0c;傻傻分不清楚。入行多年&#xff0c;一直没有系统性梳理这对李逵李鬼。最近本人在怼着why神的《其实吧&#xff0c;LRU也就那么回事》&#xff0c;方案1使用数组实现LRU&#xff0c;手写算法涉及这一对接口&a…

vs.Net2003无法打开或创建Web应用程序若干解决办法

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装&#xff0c;调试问题都被我碰到了&#xff0c;还好&#xff0c;我一个个把他记录下来了&#xff0c;同时&#xff0c;在CSDN找了一些相关的解决方法&#xff0c;不敢独享&am…

linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理

一、与Windows互传文件linux和windows互传文件&#xff0c;需要使用Xshell&#xff0c;Linux系统需要安装lrzsz包。yum install -y lrzsz //linux安装lrzsz包# sz a.txt //Linux端传输当前目录下的a.txt到windows# rz //windows端选择传输文件到Linux当前目前二、/etc/passwd和…

浅谈​与彼得原理和责任管理有关的小故事

浅谈与彼得原理和责任管理有关的小故事一&#xff09;老王虽然今年才3年工作经验&#xff0c;但一直深受领导赏识&#xff0c;因为在大家眼里他是一个责任心特别强的人。无论是领导也好&#xff0c;同事也好&#xff0c;只要有任务安排给他&#xff0c;他都会非常欣然的接受&am…

分布式防火墙技术及主要特点

随着网络的发展和普及&#xff0c;特别是互联网应用的飞速发展和普及&#xff0c;网络安全越来越受到各级用户的普遍关注。人们在享受信息化带来的众多好处的同时&#xff0c;也面临着日益突出的信息安全问题。比如&#xff1a;网络环境中国家秘密和商业秘密的保护&#xff0c;…

微软向Chromium贡献代码以优化浏览器滚动体验

喜欢就关注我们吧&#xff01;近日&#xff0c;微软为 Chromium 社区提交了一个新功能&#xff0c;用于解决以 Chromium 为内核的浏览器在 Windows 10 中滚动响应不够流畅的问题。据悉&#xff0c;Chrome 浏览器在访问某些网站并滚动时会出现抖动的情况&#xff0c;导致其在部分…

armv7的linux系统,CentOS 7(1611) for ARM(armhfp)发布

需要注意的是&#xff0c;ARM版CentOS 7.3.1611是从Red Hat Enterprise Linux 7.3系统中派生出来的&#xff0c;这就意味着操作系统能够兼容上层系统。尽管CentOS 7 Userland for armhfp来自于CentOS 7 GNU/Linux发行版本&#xff0c;但是部分预安装包已经移除&#xff0c;或者…

proftpd的配置

下载proftp最新版。下载地址&#xff1a;[url]ftp://ftp.proftpd.org/distrib/source/[/url]二、安装tar zxvf proftpd*.gz //解压文件。cd proftpd* //考虑到版本不同&#xff0c;所以我用“ * ”代替后面的字符。.…

[C#.NET 拾遗补漏]14:使用结构体实现共用体

在 C 和 C# 编程语言中&#xff0c;结构体&#xff08;Struct&#xff09;是值类型数据结构&#xff0c;它使得一个单一变量可以存储多种类型的相关数据。在 C 语言中还有一种和结构体非常类似的语法&#xff0c;叫共用体&#xff08;Union&#xff09;&#xff0c;有时也被直译…

linux新建文件夹灰色,Ubuntu新建文件夹灰了

#问题描述&#xff1a;WIn10Ubuntu双系统&#xff0c;其中WIn10系统和Ubuntu的目录“/”和“/boot”在同一块固态中&#xff0c;剩余的其他文件都在另一块机械硬盘里面。在机械硬盘下的软件(E&#xff1a;&分区5)和文档(F&#xff1a;&分区6)盘中无法新建文件夹&#x…

右击硬盘分区第一项出现Auto的解决办法

最近网上相信有不少的网友和我一样都中了这种病毒&#xff0e;就是说在右键单击你的硬盘的时候第一项不是打开而是&#xff21;&#xff35;&#xff34;&#xff2f;这个选项&#xff0e;而要想在这种情况下打开的话&#xff0c;就必须用右键单击打开&#xff0c;让我们心理真…

使用 C# 9 的records作为强类型ID - 初次使用

强类型ID实体通常是整数&#xff0c;GUID或者string类型&#xff0c;因为数据库直接支持这些类型&#xff0c;但是&#xff0c;如果实体的ID的类型是一样的&#xff0c;比如都是整数的ID&#xff0c;这有可能会出现ID值传错的问题&#xff0c;看下边的示例。public void AddPro…

linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...

一、 生产环境发现一台服务器系统时间产生偏差&#xff0c;造成服务异常解决方法a、 如果服务器硬件时间准备的话&#xff0c;可使用命令&#xff1a;~#] hwclock -s将硬件时钟同步到系统b、date [MMDDhhmm[[CC]YY][.ss]] 分别为&#xff1a;月日小时分年.秒eg:~]# date 101420…

用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)

以前的IOServer 是用VB6开发&#xff0c;驱动的配置方式和一般的组态软件没有什么很大的区别&#xff0c;配置起来比较麻烦&#xff0c;对一般的生手来说&#xff0c;要费一番功夫才能配置完毕。 总觉得原有的程序和目前的HMI图元配置环境格格不入&#xff0c;所以重新编写了驱…

HttpClientFactory 结合 Polly 轻松实现重试机制

HttpClientFactory 结合 Polly 轻松实现重试机制Intro我们的服务里有一个 API 会去调用第三方的接口&#xff0c;设置了超时时间&#xff0c;最近偶尔会发生超时的情况&#xff0c;微软在提供 HttpClientFactory 的同时&#xff0c;也提供了一个基于 Polly 的一个扩展&#xff…