.Net Core 3.0 IdentityServer4 快速入门02

640?wx_fmt=gif

.Net Core 3.0 IdentityServer4 快速入门

              —— resource owner password credentials(密码模式)

一、前言

  OAuth2.0默认有四种授权模式(GrantType):

    1)授权码模式

    2)简化模式

    3)密码模式(resource owner password credentials)

    4)客户端模式(client_credentials)

  上一小节 接受了 客户端模式 ,本小节将介绍 密码模式,OAuth2.0资源所有者密码授权功能允许客户端将用户名和密码发送到授权服务器,并获得该用户的访问令牌

  认证步骤:

    640?wx_fmt=png

    1)用户将用户名和密码提供给客户端

    2)客户端再将用户名和密码发送给授权服务器(Id4)请求令牌

    3)授权服务器(Id4)验证用户的有效性,返回给客户端令牌

    4)Api资源收到第一个(首次)请求之后,会到授权服务器(Id4)获取公钥,然后用公钥验证Token是否合法,如果合法将进行后面的有效性验证,后面的请求都会用首次请求的公钥来验证(jwt去中心化验证的思想)

    Resource Owner 其实就是User,密码模式相较于客户端模式,多了一个参与者,就是User,通过User的用户名和密码向Identity Server 申请访问令牌,这种模式下要求客户端不得存储密码,但我们并不能确保客户端是否存储了密码,所以该模式仅仅适用于受信任的客户端。因此该模式不推荐使用

二、创建授权服务器

  640?wx_fmt=png

   1)安装Id4  

640?wx_fmt=png 

  2)创建一个Config类模拟配置要保护的资源和可以访问的api客户端服务器

using IdentityServer4;	
using IdentityServer4.Models;	
using IdentityServer4.Test;	
using System.Collections.Generic;	namespace IdentityServer02	
{	public static class Config	{	/// <summary>	/// 需要保护的api资源	/// </summary>	public static IEnumerable<ApiResource> Apis =>	new List<ApiResource>	{	new ApiResource("api1","My Api")	};	public static IEnumerable<Client> Clients =>	new List<Client>	{	//客户端	new Client	{	ClientId="client",	ClientSecrets={ new Secret("aju".Sha256())},	AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,	//如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess	AllowedScopes={ "api1", IdentityServerConstants.StandardScopes.OfflineAccess},	AllowOfflineAccess=true	}	};	public static List<TestUser> Users = new List<TestUser>	{	new TestUser	{	SubjectId="001",	Password="Aju_001",	Username="Aju_001"	},	new TestUser	{	SubjectId="002",	Password="Aju_002",	Username="Aju_002"	}	};	}	
}

与客户端模式不一致的地方就在于(AllowedGrantTypes=GrantTypes.ResourceOwnerPassword)此处设置为资源所有者(密码模式)

  3)配置StartUp

using Microsoft.AspNetCore.Builder;	
using Microsoft.AspNetCore.Hosting;	
using Microsoft.Extensions.DependencyInjection;	
using Microsoft.Extensions.Hosting;	namespace IdentityServer02	
{	public class Startup	{	// This method gets called by the runtime. Use this method to add services to the container.	// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940	public void ConfigureServices(IServiceCollection services)	{	var builder = services.AddIdentityServer()	.AddInMemoryApiResources(Config.Apis)	.AddInMemoryClients(Config.Clients)	.AddTestUsers(Config.Users);19             builder.AddDeveloperSigningCredential();	}	// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.	public void Configure(IApplicationBuilder app, IWebHostEnvironment env)	{	if (env.IsDevelopment())	{	app.UseDeveloperExceptionPage();	}	// app.UseRouting();	app.UseIdentityServer();	}	}	
}

5)验证配置是否成功

  在浏览器中输入(http://localhost:5000/.well-known/openid-configuration)看到如下发现文档算是成功的

640?wx_fmt=png

 三、创建Api资源

  1)步骤如创建授权服务的1)

  2)安装包

640?wx_fmt=png

   3)创建一个受保护的ApiController

using Microsoft.AspNetCore.Authorization;	
using Microsoft.AspNetCore.Mvc;	
using System.Linq;	namespace Api02.Controllers	
{	[Route("Api")]	[Authorize]	public class ApiController : ControllerBase	{	public IActionResult Get()	{	return new JsonResult(from c in User.Claims select new { c.Type, c.Value });	}	}	
}

4)配置StartUp

using Microsoft.AspNetCore.Builder;	
using Microsoft.AspNetCore.Hosting;	
using Microsoft.Extensions.Configuration;	
using Microsoft.Extensions.DependencyInjection;	
using Microsoft.Extensions.Hosting;	namespace Api02	
{	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.AddControllers();	services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>	{	options.Authority = "http://localhost:5000";	options.RequireHttpsMetadata = false;	options.Audience = "api1";	});	}	// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.	public void Configure(IApplicationBuilder app, IWebHostEnvironment env)	{	if (env.IsDevelopment())	{	app.UseDeveloperExceptionPage();	}	app.UseRouting();	app.UseAuthentication();//认证	app.UseAuthorization();//授权	app.UseEndpoints(endpoints =>	{	endpoints.MapControllers();	});	}	}	
}

四、创建客户端(控制台 模拟客户端)

using IdentityModel.Client;	
using Newtonsoft.Json.Linq;	
using System;	
using System.Net.Http;	
using System.Threading.Tasks;	namespace Client02	
{	class Program	{	static async Task Main(string[] args)	{	// Console.WriteLine("Hello World!");	var client = new HttpClient();	var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");	if (disco.IsError)	{	Console.WriteLine(disco.Error);	return;	}	var tokenResponse = await client.RequestPasswordTokenAsync(	new PasswordTokenRequest	{	Address = disco.TokenEndpoint,	ClientId = "client",	ClientSecret = "aju",	Scope = "api1 offline_access",	UserName = "Aju",	Password = "Aju_password"	});	if (tokenResponse.IsError)	{	Console.WriteLine(tokenResponse.Error);	return;	}	Console.WriteLine(tokenResponse.Json);	Console.WriteLine("\n\n");	//call api	var apiClient = new HttpClient();	apiClient.SetBearerToken(tokenResponse.AccessToken);	var response = await apiClient.GetAsync("http://localhost:5001/api");	if (!response.IsSuccessStatusCode)	{	Console.WriteLine(response.StatusCode);	}	else	{	var content = await response.Content.ReadAsStringAsync();	Console.WriteLine(JArray.Parse(content));	}	Console.ReadLine();	}	}	
}

五、验证

  1)直接获取Api资源

640?wx_fmt=png

  出现了401未授权提示,这就说明我们的Api需要授权

  2)运行客户端访问Api资源

640?wx_fmt=png

六、自定义用户验证

  在创建授权服务器的时候我们在Config中默认模拟(写死)两个用户,这显得有点不太人性化,那我们就来自定义验证用户信息

  1)创建 自定义 验证 类 ResourceOwnerValidator 

using IdentityModel;	
using IdentityServer4.Models;	
using IdentityServer4.Validation;	
using System.Threading.Tasks;	namespace IdentityServer02	
{	public class ResourceOwnerValidator : IResourceOwnerPasswordValidator	{	public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)	{	if (context.UserName == "Aju" && context.Password == "Aju_password")	{	context.Result = new GrantValidationResult(	subject: context.UserName,	authenticationMethod: OidcConstants.AuthenticationMethods.Password);	}	else	{	context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "无效的秘钥");	}	return Task.FromResult("");	}	}	
}

2)在授权服务器StartUp配置类中,修改如下:

  640?wx_fmt=png

    3)在客户端中将 用户名 和 密码 修改成 我们在自定义 用户 验证类 中写的用户名和密码,进行测试

七、通过refresh_token 获取 Token

  1)refresh_token 

    获取请求授权后会返回 access_token、expire_in、refresh_token 等内容,每当access_token 失效后用户需要重新授权,但是有了refresh_token后,客户端(Client)检测到Token失效后可以直接通过refresh_token向授权服务器申请新的token

640?wx_fmt=png

八、参考文献

  http://docs.identityserver.io/en/latest/index.html

640?wx_fmt=gif 

640?wx_fmt=jpeg

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

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

相关文章

.Net Core3.0 日志 logging

多年的经验&#xff0c;日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试&#xff0c;可以检测到一些问题&#xff0c;但是在上线之后&#xff0c;日志的记录起到至关重要的作用。它可使我们在系统出现问…

在微软工作一年,我学会了什么

大家好&#xff0c;我是运营小马。正如我们所知道的那样&#xff0c;10.23日 &#xff0c;崔庆才因为写文写得很痛苦&#xff0c;将公众号转给我运营。10.24 我兴致勃勃又小心翼翼的宣布了我要运营10.25 崔庆才回来了&#xff0c;他说他有喷薄而出抑制不住的写作欲望&#xff0…

Eclipse调试方法

http://blog.jobbole.com/93421/ 一、Eclipse调试介绍 二、Eclipse中和Debug相关的视图 2.1 Debug View2.2 Variables View2.3 Breakpoints View2.4 Expressions View2.5 Display View 三、Debug 3.1 设置断点 3.2 调试程序 3.2.1 调试本地 Java 语言程序 3.3.2 远程调试 一、…

聊聊 Docker Swarm 部署 gRPC 服务的坑

gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向移动和 HTTP/2 设计&#xff0c;也是目前流行的微服务架构中比较突出的跨语言 RPC 框架。一直以来&#xff0c;我们的微服务都是基于 gRPC 来开发&#xff0c;使用的语言有 .NET、JAVA、Node.js&#xff0c;整体还比较…

动手造轮子:实现一个简单的依赖注入(零)

动手造轮子&#xff1a;实现一个简单的依赖注入(零)Intro依赖注入为我们写程序带来了诸多好处&#xff0c;在微软的 .net core 出来的同时也发布了微软开发的依赖注入框架 Microsoft.Extensions.DependencyInjection&#xff0c;大改传统 asp.net 的开发模式&#xff0c;asp.ne…

【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(2)

上一章《回忆一下我们的登录逻辑,主要有以下4点:当"用户名"或"密码"为空时, 是不允许登录的("登录"按钮处于禁用状态).用户名或密码不正确时, 显示"用户名或密码不正确"的消息框.用户名输入"waku", 并且密码输入"123&q…

gRPC 流式调用

gRPC 使用 Protocol buffers 作为接口定义语言&#xff08;IDL&#xff09;来描述服务接口和输入输出消息的结构&#xff0c;目前支持 4 种定义服务方法类型&#xff1a;类型说明简单 RPC客户端传入一个请求对象&#xff0c;服务端返回一个结果对象客户端流式 RPC客户端传入多个…

模型压缩案例-SSDYou only look once

http://write.blog.csdn.NET/postedit 在上一篇文章中&#xff0c;介绍了以regionproposal来检测的框架&#xff0c;这一系列速度和精度不断提高&#xff0c;但是还是无法达到实时。存在的主要问题为&#xff1a;速度不够快&#xff0c;主要原因是proposal比较多&#xff0c;特…

.NET如何将字符串分隔为字符

前言如果这是一道面试题&#xff0c;答案也许非常简单&#xff1a;.ToCharArray()&#xff0c;这基本正确……我们以“AB吉??????”作为输入参数&#xff0c;首先如果按照“正常”处理的思路&#xff0c;用 .ToCharArray()&#xff0c;然后转换为 JSON&#xff08;以便方…

Orleans 知多少 | 3. Hello Orleans

1. 引言是的&#xff0c;Orleans v3.0.0 已经发布了&#xff0c;并已经完全支持 .NET Core 3.0。所以&#xff0c;Orleans 系列是时候继续了&#xff0c;抱歉&#xff0c;让大家久等了。万丈高楼平地起&#xff0c;这一节我们就先来了解下Orleans的基本使用。2. 模板项目讲解在…

.NET Core 3.0之深入源码理解ObjectPool(二)

写在前面前文主要介绍了ObjectPool的一些理论基础&#xff0c;本文主要从源码角度理解Microsoft.Extensions.ObjectPool是如何实现的。下图为其三大核心组件图&#xff1a;核心组件ObjectPoolObjectPool是一个泛型抽象类&#xff0c;里面只有两个抽象方法&#xff0c;Get和Retu…

VC维学习

http://www.flickering.cn/machine_learning/2015/04/vc维的来龙去脉/ 说说历史Hoeffding不等式Connection to Learning学习可行的两个核心条件Effective Number of HypothesesGrowth FunctionBreak Point与ShatterVC BoundVC dimension深度学习与VC维小结参考文献 VC维在机器学…

.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库

作者&#xff1a;痴者工良&#xff08;朋友合作原创&#xff09;来源&#xff1a;https://www.cnblogs.com/whuanle/p/11743406.html目录说明一、定义角色、API、用户二、添加自定义事件三、注入授权服务和中间件三、如何设置API的授权四、添加登录颁发 Token五、部分说明六、验…

.NET Core 3.0 构建和部署

Default Executables 默认可执行文件 在 dotnet build 或 dotnet publish 期间&#xff0c;将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件。 和其他本机可执行文件一样&#xff0c;可以使用这些可执行文件执行相同操作&#xff0c;例如&#xff1a; 可以双击可执行…

为什么我会了SOA,你们还要逼我学微服务?

菜菜哥&#xff0c;我最近需要做一个项目&#xff0c;老大让我用微服务的方式来做那挺好呀&#xff0c;微服务现在的确很流行我以前在别的公司都是以SOA的方式&#xff0c;SOA也是面向服务的方式呀的确&#xff0c;微服务和SOA有相同之处面向服务的架构&#xff08;SOA&#xf…

面对万物互联的智能世界,你是否也想分一杯羹

第六届世界互联网大会于10月20日至22日在浙江乌镇顺利举行。作为世界互联网大会“13”架构的重要组成部分&#xff0c;“互联网之光”博览会以“智能互联网、开放合作——携手共建网络空间命运共同体”为主题&#xff0c;集中展示了全球范围内的互联网新技术、新成果、新产品、…

你必须知道的容器监控 (2) cAdvisor

# 实验环境&#xff1a;阿里云ECS主机&#xff08;两台&#xff09;&#xff0c;CentOS 7.401—cAdvisor简介为了解决容器的监控问题&#xff0c;Google开发了一款容器监控工具cAdvisor&#xff08;Container Advisor&#xff09;&#xff0c;它为容器用户提供了对其运行容器的…

代码阅读

http://alanse7en.github.io/caffedai-ma-jie-xi-4/ 三. 从一个比较宏观的层面上去了解caffe怎么去完成一些初始化的工作和使用Solver的接口函数&#xff0c;本文将主要分为四部分的内容&#xff1a; Google Flags的使用Register Brew Function的宏的定义和使用train()函数的…

动手造轮子:实现一个简单的依赖注入(一)

动手造轮子&#xff1a;实现一个简单的依赖注入(一)Intro在上一篇文章中主要介绍了一下要做的依赖注入的整体设计和大概编程体验&#xff0c;这篇文章要开始写代码了&#xff0c;开始实现自己的依赖注入框架。类图首先来温习一下上次提到的类图服务生命周期服务生命周期定义&am…

Qt 调试Caffe

http://blog.csdn.net/xg123321123/article/details/52817658 1.下载并安装Qt Creator 下载页面&#xff0c;推荐使用4.x版本&#xff0c;比如&#xff1a; Qt Creator 4.1.0 for Linux 64-bit下载的是run包&#xff0c;安装方法&#xff1a; cd到下载目录 chmod x xxx.run …