【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(前后端不分离),…

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和…

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

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

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

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

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

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

MBR的Linux分区机制启动过程,linux系统启动流程(MBR)

总&#xff1a;POST---> Boot Squence ---> Bootloader ---> kernel ---> init---> 完成启动系统&#xff1a;CentOS61、按下电源&#xff0c;cpu找到CMOS中的BIOS并运行起来&#xff0c;这个小程序会完成硬件自检。BIOS&#xff1a;Basic Input and Output Sys…

.netcore 极速接入第三方登录

新年新气象&#xff0c;趁着新年的喜庆&#xff0c;肝了十来天&#xff0c;终于发了第一版&#xff0c;希望大家喜欢。如果有不喜欢看文字的童鞋&#xff0c;可以直接看下面的地址体验一下&#xff1a;Github: https://github.com/mrhuo/MrHuo.OAuth唯一官网&#xff1a;https:…

mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具

MongoDB 提供了 linux 各发行版本 64 位的安装包&#xff0c;你可以在官网下载安装包。下载地址&#xff1a;https://www.mongodb.com/download-center#community下载完安装包&#xff0c;并解压 tgz(以下演示的是 64 位 Linux上的安装) 。curl -O https://fastdl.mongodb.org/…

年轻有为的老黄2020

0x01 不知道开篇要说什么好&#xff0c;那就来个经典的 0x01 吧。这个世界不止苟且&#xff0c;还有诗和远方。工作 工作上面还算是比较忙碌的&#xff0c;在20年也做了很多东西&#xff0c;本来面试进公司的时候title是高开&#xff0c;在基础架构组&#xff0c;光杆部门。过完…

推荐:Dapper扩展-Dapper.SimpleCRUD

背景Dapper目前应该是大家比较喜欢的orm框架之一&#xff0c;但是它灵活的背后&#xff0c;还是有很多不尽人意的地方&#xff0c;谁想编写基本的读取/插入/更新/删除语句&#xff1f;下面推荐SimpleCRUD为Dapper提供了简单的CRUD帮助器。解放了大家&#xff0c;提高生产力。功…

群策群力:破机房征求灵丹妙药

我校有一年代久远之计算机教室&#xff0c;现已经迈入日落西山之境。特征求灵丹妙药&#xff0c;不求妙手回春&#xff0c;只愿其能为我校的信息技术教育事业再尽最后一把微力&#xff0c;也为我校即将面临无地授课的教师提供继续上岗的救命稻草一枝。具体情况说明&#xff1a;…

使用 C# 9 的records作为强类型ID - 路由和查询参数

上一篇文章&#xff0c;我介绍了使用 C# 9 的record类型作为强类型id&#xff0c;非常简洁public record ProductId(int Value);但是在强类型id真正可用之前&#xff0c;还有一些问题需要解决&#xff0c;比如&#xff0c;ASP.NET Core并不知道如何在路由参数或查询字符串参数中…

公司高层要我转Java 我直接邮件回怼...

2020年艰难而短暂&#xff0c;而互联网的历史车轮还是轰隆隆一路向前&#xff0c;服务网格/云原生/Serverless架构&#xff0c;各种新架构大行其道。重新审视当下主流的编程语言&#xff0c;天下第一的Java已老&#xff0c;下行多年的.NET却浴火重生&#xff0c;焕发生机&#…