ASP.NET Core IdentityServer4 新手上路
OAuth2.0资料
今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准(如果是按照参考文章复制粘贴,应该不会出现踩坑,但是我喜欢自己手动敲一遍),发现几个坑,因而总结下经验,让其他小白同学少走弯路
参考第一篇:https://www.cnblogs.com/cby-love/p/9281955.html
参考第二篇:https://www.cnblogs.com/wyt007/p/8284482.html
博客园晓晨的关于identityServer4的中文文档地址: http://www.cnblogs.com/stulzq/p/8119928.html
Docker中文文档 https://yeasy.gitbooks.io/docker_practice/content/
OAuth2.0(Open Authorization)是一个开放授权协议;第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户资源
OAuth的步骤一般如下:
1、客户端要求用户给予授权
2、用户同意给予授权
3、根据上一步获得的授权,向认证服务器请求令牌(token)
4、认证服务器对授权进行认证,确认无误后发放令牌
5、客户端使用令牌向资源服务器请求资源
6、资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源
服务端代码实现
第一步:新建一个webapi空项目
第二步:添加Nuget包:IdentityServer4
第三步:新建一个帮助类(类名自定义即可),用来创建IdentityServer4.Model生成授权token
public class Config{/// <summary>/// 所有可以访问的Resource/// </summary>/// <returns></returns>public static IEnumerable<ApiResource> GetResources(){return new List<ApiResource>{ //第一个参数需要与下面标记红色字体保持一致,可以随意命名,但是请注意大小写,第二个参数 我干了,你随意。new ApiResource("api","My Api")};}/// <summary>/// 客户端/// </summary>/// <returns></returns>public static IEnumerable<Client> GetClients(){return new List<Client>{new Client(){ClientId="client",////模式:最简单的模式AllowedGrantTypes=GrantTypes.ClientCredentials,ClientSecrets={new Secret("secret".Sha256())},AllowedScopes={ "api"}}};}}
第一处坑讲解:上面代码红色标记,请注意大小写,如果一个大写,一个小写。当你授权的时候会提示错误
第四步:修改Startup.cs 红色字体是需要加的方法和中间件
public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){ services.AddIdentityServer().AddDeveloperSigningCredential()//添加开发人员签名凭据.AddInMemoryApiResources(Config.GetResources())//添加内存apiresource.AddInMemoryClients(Config.GetClients());//添加内存client services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseIdentityServer();//使用IdentityServer app.UseMvc();}}
第五步:修改Program.cs 其实这一步可以省略掉,因为这一部将api不托管在IIS Express上,通过控制台程序启动。 自定义路径配置如下
public class Program{public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() //该处端口可以自定义 只要不与你其他端口冲突就好.UseUrls("http://localhost:5000");}
第二处坑讲解:生成token的服务端已经全部设置完成,如果你按照以前习惯,启动F5---会发现自定义端口未起作用。你需要设置一下才行
http://localhost:5000/.well-known/openid-configuration访问 ;可以看到是一个restful的api
然后用postman神器 服务端成功,咱们开始用客户端
客户端代码实现
第一步:新建一个webapi空项目
第二步:添加Nuget包:IdentityServer4.AccessTokenValidation
第三步:修改Startup.cs 红色字体是需要加的方法和中间件
public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){ services.AddAuthentication("Bearer")//添加授权模式.AddIdentityServerAuthentication(Options =>{Options.Authority = "http://localhost:5000";//授权服务器地址Options.RequireHttpsMetadata = false;//是否是httpsOptions.ApiName = "api";});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseAuthentication();//使用授权中间件 app.UseMvc();}}
第三处坑讲解:
1.授权服务地址端口号,请按照服务端配置的端口号来,如果用IIS Express,请右键项目属性->调试查看。
2.Options.ApiName = "api"; 请看上述踩坑一配置的名称,大小写需要统一
第四步:修改Program.cs 其实这一步可以省略掉,因为这一部将api不托管在IIS Express上,通过控制台程序启动。与上述服务端配置一样。记得将端口号修改
第四处需要注意的地方
需要将服务端运行起来,然后再运行客户端(顺序不重要,重要的是必须两个程序都启动起来。可以将服务端发布到IIS上,客户端通过vs运行。我比较懒,分别打开两个,一个设置为启动服务端,一个设置为启动客户端)
第五步:添加授权标签 可以在action和controller上添加
[HttpGet][Authorize] public ActionResult<IEnumerable<string>> Get(){return new string[] { "value1", "value2" };}
添加在action上,表示这个方法需要授权才能访问,否则访问不了
添加在controller上,表示整个controller下的所有action方法都需要授权后才能访问
下图是成功,如果空白表示授权失败(你可以打个断点)。
出现一些错误码html(<title>Internal Server Error</title>)在里面,是因为服务端没启动成功
需要注意的地方:授权码 前面必须加Bearer 然后空格
在客户端配置第三步中 services.AddAuthentication("Bearer")//添加授权模式 有的同学可能会想 那我将这个改掉 然后保持一致应该可以
恭喜这位同学想法非常棒,但是你可以试一试。这个格式是固定规范
转载于:https://www.cnblogs.com/xiaobai123/p/9284874.html
ASP.NET Core IdentityServer4 新手上路相关推荐
- Asp.Net Core IdentityServer4 管理面板集成
前言 IdentityServer4(以下简称 Id4) 是 Asp.Net Core 中一个非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以轻松集成到 Asp.Net C ...
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
- Asp.Net Core 中IdentityServer4 授权流程及刷新Token
一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
一.前言 查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...
- 10个小技巧助您写出高性能的ASP.NET Core代码
今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...
- asp.net core系列 53 IdentityServer4 (IS4)介绍
一.概述 在物理层之间相互通信必须保护资源,需要实现身份验证和授权,通常针对同一个用户存储.对于资源安全设计包括二个部分,一个是认证,一个是API访问. 1 认证 认证是指:应用程序需要知道当前用户的 ...
- ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍
一.整体情况 现代应用程序看起来更像这个: 最常见的相互作用: 浏览器与Web应用程序的通信 Browser -> Web App Web应用程序与Web API通信 基于浏览器的应用程序与We ...
- ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
原文:ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范 IdentityServer实现以下规范: OpenID Connect OpenID Connect ...
最新文章
- python入门看什么书-请问初学者学Python看那本书?
- android更改menu字体颜色,Android动态修改menu颜色
- react学习(61)--js contact
- vscode vetur 不想标签属性老是转行 配置
- java model 封装_Java封装统一的Result Model案例
- ECCV 2020 论文大盘点-3D人体姿态估计篇
- 洛谷 P1404 平均数
- 为什么事业单位公务员的公积金比企业里要缴得多?
- python3编译成exe运行_python3.x的程序如何打包成exe可执行文件
- 如何选择 Offer?
- 【Java中的网络编程】
- 简单测试Content-Length和Chunked两种不同的数据传输方式
- ST电机库无感FOC模式接电机前准备工作(1)----PWM波的生成
- mysql中clear怎么用_MySQL 入门篇
- PowerBuilder 2017R3安装指南2021最新
- Utils 前端随机生成id,中文姓名
- Easyx图形库小游戏---迷宫
- 高中数学联赛二试怎么准备
- 关于coutends你不知道的那些事
- 一款好用的基于vue的录屏插件recordrtc,拿走不谢
热门文章
- 输出节点位移_绝对值信号的编码器有哪些信号输出(一、二)
- python socket recvfrom_Python socket学习笔记(一)
- 【Android OpenGL ES 开发 (四)】纹理相关(一)
- ​嵌入式开发为什么选择C语言?
- 计算机病毒需要附着在,计算机病毒是如何传播的?
- php验证码 php中文网,ThinkPHP 使用不同风格及中文的验证码
- 简单比对照片是否相同_小新说法 | 如何认定商标是否侵权?
- [渝粤教育] 郑州大学 互联网国际政治学 参考 资料
- [渝粤教育] 西南科技大学 经济法概论 在线考试复习资料2021版(3)
- 【渝粤题库】陕西师范大学202831 程序设计 作业(专升本)