IdentityServer4实战详解
IDS4
- 一、参考文章
- 1.OAuth2.0和OCID讲解
- 二、个人总结
- 1.Implicit隐式流程认证服务器端
- (1)创建IDS4认证服务器和客户端
- (2)修改IDS4认证服务器的视图UI
- (3)添加资源配置
- (4)Program配置(相当与3.1的Startup配置,6.0Startup类被删了)
- 2.Implicit隐式流客户端
- (1)修改Program
- (2)添加认证特性
一、参考文章
注意IDS4的版本与之前的版本有所不同,这些文档有些是旧版本,需要细微调整,会在下文给予标注
1.OAuth2.0和OCID讲解
IDS4官方文档
IDS4官方文档
晓晨Master的概念详解
概念理解
*Hunter的项目实战
实战项目
阮一峰的网络日志
阮一峰的网络日志
二、个人总结
基于使用的net6版本
1.Implicit隐式流程认证服务器端
Nuget包安装
(1)创建IDS4认证服务器和客户端
创建认证服务器MVC模板
创建MVC客户端(两个都选择MVC模板)
分别打开认证服务器和客户端的Propertieswen文件中launchSetting.json修改启动地址
客户端是5001 ,认证服务器设置为5000
项目启动以项目启动
(2)修改IDS4认证服务器的视图UI
- 进入认证服务器的项目的根目录,键入CMD界面
- 创建Ids4的UI界面
执行dotnet new is4ui --force,–force是强制覆盖原有的mvc文件,
如果没有模板,先下载模板, 1)安装模板命令:dotnet new -i IdentityServer4.Templates- 现在的目录结构
删除Controller文件因为Quickstart文件中也有HomeController,会有多个端点,出现错误
(3)添加资源配置
- 创建Config.cs文件
public static class Config{public static IEnumerable<ApiResource> GetApiResources(){return new List<ApiResource>{new ApiResource("api1", "My API")};}public static IEnumerable<Client> GetClients(){return new List<Client>(){new Client(){ClientId="client1",ClientName="mvc client",AllowedGrantTypes=GrantTypes.Implicit,RedirectUris={"http://localhost:5001/signin-oidc"},PostLogoutRedirectUris={"http://localhost:5001/signout-callback-oidc"},FrontChannelLogoutUri = "http://localhost:5000/signout-idsrv",AllowAccessTokensViaBrowser=true,AllowedScopes=new List<string>{IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile}}};}public static List<TestUser> GetUsers(){return new List<TestUser>{new TestUser{SubjectId = "1",Username = "alice",Password = "password"},new TestUser{SubjectId = "2",Username = "bob",Password = "password"}};}public static IEnumerable<IdentityResource> GetIdentityResources(){return new List<IdentityResource>{new IdentityResources.OpenId(),new IdentityResources.Profile(),};}}
(4)Program配置(相当与3.1的Startup配置,6.0Startup类被删了)
Program.CS
var builder = WebApplication.CreateBuilder(args);//部分浏览器版本较新SameSite不设置会出现报错,
builder.Services.Configure<CookiePolicyOptions>(options =>
{options.MinimumSameSitePolicy = SameSiteMode.Lax;options.OnAppendCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);options.OnDeleteCookie = cookieContext =>CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
static void CheckSameSite(HttpContext httpContext, CookieOptions options)
{if (options.SameSite == SameSiteMode.None){var userAgent = httpContext.Request.Headers["User-Agent"].ToString();options.SameSite = SameSiteMode.Lax;}
}// Add services to the container.//添加mvc,后面登录需要
builder.Services.AddMvc();
builder.Services.AddControllersWithViews();//这部分是对资源的配置
builder.Services.AddIdentityServer()//添加身份资源配置.AddInMemoryIdentityResources(Config.GetIdentityResources())//设置证书.AddDeveloperSigningCredential()//添加API资源设置.AddInMemoryApiResources(Config.GetApiResources())//推荐测试用户.AddTestUsers(Config.GetUsers())//添加客户端.AddInMemoryClients(Config.GetClients());
var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();app.UseCookiePolicy();
app.UseRouting();
app.UseIdentityServer();
app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();
2.Implicit隐式流客户端
(1)修改Program
var builder = WebApplication.CreateBuilder(args);builder.Services.Configure<CookiePolicyOptions>(options =>
{options.MinimumSameSitePolicy = SameSiteMode.Unspecified;options.OnAppendCookie = cookieContext =>SetSameSite(cookieContext.Context, cookieContext.CookieOptions);options.OnDeleteCookie = cookieContext =>SetSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
//部分浏览器版本较新SameSite不设置会出现报错,
void SetSameSite(HttpContext httpContext, CookieOptions options)
{if (options.SameSite == SameSiteMode.None){if (httpContext.Request.Scheme != "https"){options.SameSite = SameSiteMode.Unspecified;}}
}
builder.Services.Configure<CookiePolicyOptions>(options =>
{// This lambda determines whether user consent for non-essential cookies is needed for a given request.options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;
});builder.Services.AddMvc();
//AddAuthentication将认证服务添加到DI
builder.Services.AddAuthentication(options => {options.DefaultScheme = "Cookies";//设置Cookies为主要认证手段options.DefaultChallengeScheme = "oidc";//当需要登录时使用OpenID Connect方案
})
.AddCookie("Cookies")//使用AddCookie添加可以处理cookie的处理程序。
.AddOpenIdConnect("oidc", options => {options.SignInScheme = "Cookies";options.Authority = "http://localhost:5000";options.RequireHttpsMetadata = false;options.ClientId = "client1";options.SaveTokens = true;
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();//添加Cookie,不让报错,无法正常使用
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
// 看登录的用户是否有权限
app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();
(2)添加认证特性
自带的HomeController中添加,当未登录用户访问触发认证流程
IdentityServer4实战详解相关推荐
- 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例
本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...
- R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等
R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录
- R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- R语言tidyr包separate()函数实战详解:一列裂变为多列
R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列
- 《oracle大型数据库系统在AIX/unix上的实战详解》讨论31: oracle、sybase 数据库的不同访问...
<Oracle大型数据库系统在AIX/UNIX上的实战详解> 讨论31: oracle.sybase 数据库的不同访问方式 文平. 用户来信要求更细节比较一下Oracle和sybas ...
- 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...
最新文章
- MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)
- 基于存储过程的可扩展性数据访问框架
- PHP中include()与require()的区别说明
- 【干货】女性社区应该如何抵御垃圾男
- <读书笔记> Thinking in python (Python 设计模式) 1. Singlton的c++与python的实现
- java反射api研究_深入研究Java 8中的可选类API
- 两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...
- Intel 收购计算机视觉开发公司 Itseez
- Java 目录操作一(递归创建目录、删除目录、判断目录是否为空、判断文件是否隐藏、获取目录大小、在指定目录中查找文件)
- hibernate 各种主键生成策略(转)
- 为什么Linux内核常用unsigned long来代替指针
- ubuntu下python多版本切换问题
- 2017-08-16 BEX5下集成FullCalendar
- 【BZOJ1703】【usaco2007margold】ranking the cows 奶牛的魅力排名
- 哲理故事300篇 下
- Java自学第15天 面向对象(全)
- 耐心看完,越到后面越精彩
- day16-20180705-流利阅读笔记
- Python员工信息作业
- 主动降噪相消干涉原理